如何定制JAXB序列化的XML输出

如何定制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中

我有一些@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设置

//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模式验证(以及针对模式无效输入的适当错误报告)之前非常简单。一旦我开始沿着这条路走下去,泽西就从“脑死”式的简单变成了相当艰难的。主要的困难是从网上的各种帖子中找出所有的细节。希望这将帮助您走得更远、更快。:-)