以下应该会有所帮助。EclipseLink 论坛也在处理这个问题:
由于某种原因,模式位置属性消失了。
您可以在 上指定以下属性Marshaller
以输出架构位置:
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.forum-datenaustausch.ch/invoice generalInvoiceResponse_440.xsd");
第二个问题是,所有前缀都消失了。
命名空间前缀消失了,但命名空间限定是相同的(所有元素都具有相同的本地名称和命名空间 URI)。在第一个文档中,invoice
前缀被分配给http://www.forum-datenaustausch.ch/invoice
命名空间,而在第二个文档中,命名空间被分配为默认命名空间
在设计时控制命名空间前缀
@XmlSchema
您可以利用注释提供 MOXy 提示,说明应使用哪些命名空间前缀(请参阅: http ://blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html )。
包信息
@XmlSchema(
elementFormDefault=XmlNsForm.QUALIFIED,
namespace="http://www.forum-datenaustausch.ch/invoice",
xmlns={
@XmlNs(prefix="invoice", namespaceURI="http://www.forum-datenaustausch.ch/invoice"),
@XmlNs(prefix="ds", namespaceURI="http://www.w3.org/2000/09/xmldsig#"),
@XmlNs(prefix="xenc", namespaceURI="http://www.w3.org/2001/04/xmlenc#")
}
)
package forum16559889;
import javax.xml.bind.annotation.*;
回复
package forum16559889;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Response {
}
演示
package forum16559889;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Response.class);
Response response = new Response();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.forum-datenaustausch.ch/invoice generalInvoiceResponse_440.xsd");
marshaller.marshal(response, System.out);
}
}
输出
<?xml version="1.0" encoding="UTF-8"?>
<invoice:response xsi:schemaLocation="http://www.forum-datenaustausch.ch/invoice generalInvoiceResponse_440.xsd" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:invoice="http://www.forum-datenaustausch.ch/invoice" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
在运行时控制命名空间前缀
您可以利用 MOXy 的NamespacePrefixMapper
扩展来控制运行时使用的命名空间前缀。
package forum16559889;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.eclipse.persistence.oxm.NamespacePrefixMapper;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Response.class);
Response response = new Response();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.forum-datenaustausch.ch/invoice generalInvoiceResponse_440.xsd");
marshaller.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER, new NamespacePrefixMapper() {
@Override
public String getPreferredPrefix(String namespaceUri,
String suggestion, boolean requirePrefix) {
if("http://www.forum-datenaustausch.ch/invoice".equals(namespaceUri)) {
return "invoice";
} else if("http://www.w3.org/2000/09/xmldsig#".equals(namespaceUri)) {
return "ds";
} else if("http://www.w3.org/2001/04/xmlenc#".equals(namespaceUri)) {
return "xenc";
} else {
return null;
}
}
});
marshaller.marshal(response, System.out);
}
}