目前我正在使用JAX-RS并让JAXB绑定自动处理在JEE6项目中将数据转换为XML和JSON。在我尝试创建一个通用响应对象来包装我的所有信息之前,一切都非常有效。
当我尝试使用我的通用响应类com.eln00b.Wrapper
(其中包含private Object result
属性)时,我得到:
javax.xml.bind.MarshalException - 包含链接异常:[com.sun.istack.SAXException2:类com.eln00b.CustomObject或其任何超类都为此上下文所知。 javax.xml.bind.JAXBException:类com.eln00b.CustomObject或其任何超类都为此上下文所知。]
所以我添加到com.eln00b.Wrapper
:
@XmlSeeAlso ({com.eln00b.CustomObject})
public class Wrapper {
}
一切正常。
我希望这是非常通用的。我不想经常在@XmlSeeAlso
类的com.eln00b.Wrapper
注释中添加类。 如何让系统自动找到JAXB上下文的所有类?
即使我使用像Reflections之类的东西来加载数据,这也很好。我只是不确定如何在没有@XmlSeeAlso
注释的情况下加载所有数据的上下文。有了大量的注释,我将创建它只是根本不起作用。
只需添加数据即可手动完成手动转换。但是,我不想要使用手动XML / JSON创建,除非我绝对需要(我不想处理内容协商或其他任何事情)。
样品:
JAXBContext.newInstance(new Class[] {Wrapper.class, CustomObject.class});
答案 0 :(得分:2)
所以这就是自定义解析器的本质:
@Provider
@Produces ({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public class JaxbContextResolver implements ContextResolver<JAXBContext> {
@Override
public JAXBContext getContext(Class<?> type) {
// load appropriate context data
Class[] bindTypes = ...
// create
try {
return JAXBContext.newInstance(bindTypes);
} catch (JAXBException e) {
// todo: this can be handled better but works for the example
throw new RuntimeException(e);
}
}
}
现在,&#34; 的处理加载适当的上下文数据&#34;很简单。基本上使用运行时数据模仿@XmlSeeAlso
:
现在,我使用了一些缓存来帮助自己提高效率。我还为我的根对象创建了一个稍微复杂的设置,它实际上跟踪了它自己的类数据并使其非常快速。我还创建了一个替代方案,将类标记为&#34; contextual&#34;我使用包检查通过注释加载,只是自动添加到上下文但我还没有检查效率。我对第三个实现有一些想法,但我想完成更多的基准测试。