如何定制JAXB序列化的XML输出
我有一些@javax.xml.bind.annotation.xml。。。这里的注释类用于RESTWeb服务。Jersey设置在spring管理的web容器中,web服务返回格式良好的xml。我们使用maven Enounciate插件来记录web服务,并为返回的xml文档创建xsd。现在,我想将文档xsd文件用作返回的xml文件中的schemaLocation,这样xml验证就不会抱怨缺少定义。如何为此配置XML序列化?如果我没记错,我必须做一些事情才能将名称空间标识符正确写入生成的XML中 1) 创建了一个配置并返回自定义封送拆收器(顺便说一句,还有解编程序)的JaxbFactory。我省略了下面的getter/和unmarshalling设置如何定制JAXB序列化的XML输出,jaxb,jersey,xmlserializer,Jaxb,Jersey,Xmlserializer,我有一些@javax.xml.bind.annotation.xml。。。这里的注释类用于RESTWeb服务。Jersey设置在spring管理的web容器中,web服务返回格式良好的xml。我们使用maven Enounciate插件来记录web服务,并为返回的xml文档创建xsd。现在,我想将文档xsd文件用作返回的xml文件中的schemaLocation,这样xml验证就不会抱怨缺少定义。如何为此配置XML序列化?如果我没记错,我必须做一些事情才能将名称空间标识符正确写入生成的XML中
//constructor
public JaxbFactory() throws Exception {
context = JAXBContext.newInstance(ResourceDto.class);
// Setup the marshaller
marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, XmlMetadataConstants.XML_SCHEMA_LOCATION); // this schema location is used in generating the schema-location property in the xml
}
2) 该工厂类对Jersey不可见。为了使其可见,我创建了一个MarshallerProvider。看起来是这样的:
@Provider
public class ResourceJaxbMarshallerProvider implements ContextResolver<Marshaller> {
// injected by Spring
private ResourceJaxbFactory ResourceJaxbFactory;
private ResourceStatusJaxbFactory ResourceStatusJaxbFactory;
/*
* ----------------------------------------
* Setters (for Spring injected properties)
* ----------------------------------------
*/
public void setResourceJaxbFactory(ResourceJaxbFactory ResourceJaxbFactory) {
this.ResourceJaxbFactory = ResourceJaxbFactory;
}
public void setResourceStatusJaxbFactory(ResourceStatusJaxbFactory ResourceStatusJaxbFactory) {
this.ResourceStatusJaxbFactory = ResourceStatusJaxbFactory;
}
/*
* ------------------------
* Interface Implementation
* ------------------------
*/
public Marshaller getContext(Class<?> type) {
if (type == ResourceDto.class)
return ResourceJaxbFactory.getMarshaller();
else if (type == ResourceStatusDto.class)
return ResourceStatusJaxbFactory.getMarshaller();
else
return null;
}
}
/*
* Note that this file is critical for ensuring that our ResourceDto object is
* marshalled/unmarshalled with the correct namespace. Without this, marshalled
* classes produce XML files without a namespace identifier
*/
@XmlSchema(namespace = XmlMetadataConstants.XML_SCHEMA_NAMESPACE, elementFormDefault = XmlNsForm.QUALIFIED)
package com.yourcompany.resource;
import javax.xml.bind.annotation.XmlNsForm;
至少我认为这就是我需要做的一切,我记不清每一件事了。我确实记得package-info.java部分是最后一个关键的齿轮,它使所有的东西结合在一起 希望有帮助。我花了太多时间去挖掘这一切的信息。Jersey在我希望它执行正确的xml模式验证(以及针对模式无效输入的适当错误报告)之前非常简单。一旦我开始沿着这条路走下去,泽西就从“脑死”式的简单变成了相当艰难的。主要的困难是从网上的各种帖子中找出所有的细节。希望这将帮助您走得更远、更快。:-)