无法从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.
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