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

标签 java xml spring-mvc jaxb wadl

我正在尝试使用 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)添加注释,但我不想更改和/或分析数百个类。

相关链接

已编辑

很遗憾,我无法更改 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 作为映射字段/属性处理,但不能将其作为根级对象处理。您可能有一个对应于返回到采用 Map 的 RESTful 操作的方法。

如何解决

  1. 不是将 Map 作为根级对象,您可以引入一个新的域对象,该对象具有 Map 类型的映射字段/属性并使用它。<
  2. 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/

相关文章:

xml - Powershell System.Xml.XmlElement 但我使用 System.Xml.XmlDocument?

java - hibernate : Why is it trying to drop/create database on startup?

java - spring boot 用户和 session mongo

java - 使用 Spring MVC 从本地路径删除图像

java - 如何使用HttpClient将文件上传到Ubuntu的特定路径

java - 是否有一种干净的方法来检索 AWT 事件分派(dispatch)线程

java - 为什么我在 if 语句中定义 double 时遇到问题?

java - 哪个接口(interface)的方法在类中实现了

PHP/MySQL/XML 给出错误

java - 安卓.view.InflateException : Binary XML file: Error inflating class