编程语言
首页 > 编程语言> > 无法从JAXB发现QNAme类:java.util.Map

无法从JAXB发现QNAme类:java.util.Map

作者:互联网

我正在尝试使用Spring Wadl Generator:https://github.com/autentia/wadl-tools.

AFAIK,此工具使用Tomasz Nurkiewicz @ tomasz-nurkiewicz的相同思想:从Spring获取RequestMappingHandlerMapping,检查每个元素并生成适当的WADL.

在内部,该工具将使用JAXB在控制器中创建参数的XML.据我所知,但在我的应用程序中运行不正常.

我有以下异常:

2014-02-07 15:33:41,827 WARN  user=unauthenticatedUser com.autentia.xml.namespace.QNameBuilder  - Cannot discover QName from JAXB annotations for class: java.util.Map. Preparing generic QName.com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.util.Map is an interface, and JAXB can't handle interfaces.
    this problem is related to the following location:
        at java.util.Map

来自(简化的stacktrack)

at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:106)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:471)
    (...)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
    (...)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
at com.autentia.xml.namespace.QNameBuilder.discoverQNameFromJaxb(QNameBuilder.java:68)
    (...)
at com.autentia.web.rest.wadl.builder.ApplicationBuilder.build(ApplicationBuilder.java:36)

问题

我可以强制将默认适配器连接到接口吗?

通常,人们只可以为与特定适配器的接口添加注释,但是我不想更改和/或分析数百个类.

相关链接

> java.util.List is an interface, and JAXB can’t handle interfaces
> http://blog.bdoughan.com/2013/03/jaxb-and-javautilmap.html
> https://weblogs.java.net/blog/2006/06/06/jaxb-and-interfaces

已编辑

不幸的是,我无法更改REST API.

javadoc of MessageWriter开始:

Contract for a provider that supports the conversion of a Java type to a stream. To add a MessageBodyWriter implementation, annotate the implementation class with @Provider.

WADL应该按原样提供服务信息.例如,通过注释添加MessageBodyWriter会更改API.由于我可以更改QNameBuilder.discoverQNameFromJaxb,是否可以在这个“瞬间”将MessageBodyWriter更改/提供为java.util.Map并更改回WADL生成?

解决方法:

是什么引起问题的

JAXB(JSR-222)实现可以将java.util.Map作为映射的字段/属性进行处理,但不能将其作为根级对象进行处理.您可能有一个与RESTful操作相对应的方法,该方法返回以获取Map.

如何解决

>除了将Map作为根级对象之外,您还可以引入一个新的域对象,该对象具有Map类型的映射字段/属性,并使用它.
>为Map类实现MessageBodyReader / MessageBodyWriter,以便将其代替使用JAXB.

更新

I don’t wanna change and analyze hundred of classes

你不会的.您只需添加一个MessageBodyReader / MessageBodyWriter即可识别Map类(对于“ application / xml”媒体类型),以对其进行特殊处理.另一种选择是保持异常.

Basically I cannot change the REST API.

您不会更改REST API.您需要确保您的MessageBodyReader / MessaggeBodyWriter正常工作.

By using a low level of dark magic, would be possible supply a
MessageBodyWriter for the Map and remove after that?

并不是真正的低级或黑暗魔法.您可以只为Map类提供特殊处理.

标签:jaxb,wadl,xml,java,spring-mvc
来源: https://codeday.me/bug/20191122/2057390.html