解释与变通
目前,我正在使用JAX,让JAXB绑定在JEE6项目中自动处理将数据转换为XML和JSON的过程。在我尝试创建一个通用的响应对象来包装我所有的信息之前,一切都非常完美。
当我尝试使用我的泛型响应类com.eln00b.Wrapper
(其中包含一个private Object result
属性)时,我得到:
javax.xml.bind.MarshalException -除了链接的例外: com.sun.istack.SAXException2: class 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上下文的所有类?
即使这是我使用反思之类的东西加载数据的黑客,这也没问题。我只是不知道如何在不使用@XmlSeeAlso
注释的情况下获得加载所有这些数据的上下文。有了大量的注释,我将创建它,它将根本无法工作。
它是如何手动工作的
它只是通过添加数据来手动工作,比如手动转换。但是,我不想使用/JSON创建,除非我绝对需要(我不想处理内容协商或类似的事情)。
示例:
JAXBContext.newInstance(new Class[] {Wrapper.class, CustomObject.class});
发布于 2014-08-22 05:39:37
因此,以下是自定义解析器的本质:
@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);
}
}
}
现在,对“加载适当的上下文数据”的处理非常简单。基本上,通过使用运行时数据模拟@XmlSeeAlso
:
现在,我使用了一些缓存来帮助自己提高效率。我还为我的根对象创建了一个稍微复杂一些的设置,它实际上独立地跟踪类数据,并使它非常快速。我还创建了一个将类标记为“上下文”的替代方法,我使用包检查通过注释加载类,并且只是自动添加到上下文中,但我还没有检查效率。我有一些关于第三个实现的想法,但我想让更多的基准完成。
https://stackoverflow.com/questions/25410831
复制相似问题