繁体   English   中英

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

[英]Cannot Discover QNAme from JAXB for class: java.util.Map

我正在尝试使用Spring Wadl Generatorhttps//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

来自(简化的堆栈跟踪)

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)

这个问题

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

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

相关链接

编辑

不幸的是我无法更改REST API。

MessageWriter的javadoc

支持将Java类型转换为流的提供程序的合同。 要添加MessageBodyWriter实现,请使用@Provider注释实现类。

WADL应该提供服务信息。 例如,通过注释添加MessageBodyWriter会更改API。 既然我可以更改QNameBuilder.discoverQNameFromJaxb,那么在这个非常“瞬间”的MessageBodyWriter可能会更改/提供到java.util.Map并更改回WADL生成吗?

是什么导致了这个问题

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

如何解决它

  1. 相反,具有Map为根级别对象,您可以引入具有类型的映射字段/属性一个新的域对象Map并使用它。
  2. Map类实现MessageBodyReader / MessageBodyWriter ,以便使用它来代替正在使用的JAXB。

UPDATE

我不想改变和分析数百个班级

你不会。 您只需添加一个MessageBodyReader / MessageBodyWriter识别Map类(对于“application / xml”媒体类型)以对其进行特殊处理。 另一种方法是继续获得例外。

基本上我无法更改REST API。

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

通过使用低级别的暗魔法,可以为Map提供MessageBodyWriter并在之后删除吗?

它不是那么低级别或黑暗魔法。 您可以仅为Map类提供特殊处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM