我正在尝试使用 Spring Wadl 生成器:https://github.com/autentia/wadl-tools .
据我所知,此工具使用与 Tomasz Nurkiewicz 相同的想法@tomasz-nurkiewicz:从 Spring 获取 RequestMappingHandlerMapping,检查每个元素并生成适当的 WADL。
在内部,该工具将使用 JAXB 创建 Controller 中参数的 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
来自(简化的堆栈跟踪)
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)
问题
我可以强制将默认适配器连接到接口(interface)吗?
通常人们可以只为特定适配器的接口(interface)添加注释,但我不想更改和/或分析数百个类。
相关链接
- 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
作为映射字段/属性处理,但不能将其作为根级对象处理。您可能有一个对应于返回到采用 Map
的 RESTful 操作的方法。
如何解决
- 不是将
Map
作为根级对象,您可以引入一个新的域对象,该对象具有Map
类型的映射字段/属性并使用它。< - 为
Map
类实现一个MessageBodyReader
/MessageBodyWriter
,以便使用它而不是使用 JAXB。
更新
I don't wanna change and analyze hundred of classes
你不会。您只需添加一个识别 Map
类(对于“application/xml”媒体类型)的 MessageBodyReader
/MessageBodyWriter
即可进行特殊处理为了它。另一种方法是继续获取异常。
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
类提供特殊处理。
关于java - 无法从类 : java. util.Map 的 JAXB 中发现 QNAme,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21632403/