Spring OXM: 使用jaxb2 marshaller管理不同模式的命名空间

10 浏览
0 Comments

Spring OXM: 使用jaxb2 marshaller管理不同模式的命名空间

如何根据用于生成XML的XSD管理命名空间前缀?我有3个不同的XSD文件,使用maven的jaxb2-maven-plugin,我可以生成Java类。但是我无法根据对应的模式生成具有特定命名空间前缀的XML文件。以下是我的jaxb2marshaller配置:

@Bean

public Marshaller ltiMarshaller() {

Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();

Map map = new HashMap();

map.put("jaxb.formatted.output", true);

map.put("com.sun.xml.bind.namespacePrefixMapper", new ManifestNamespaceMapper());

jaxb2Marshaller.setMarshallerProperties(map);

jaxb2Marshaller.setContextPaths(

"com.abc.xyz.generated.basicltilink",

"com.abc.xyz.generated.lommanifest",

"com.abc.xyz.generated.lomresource",

"com.abc.xyz.generated.manifest",

"com.instructure.canvas.xsd.cccv1p0"

);

return jaxb2Marshaller;

}

以下是我的ManifestNamespaceMapper.java:

public class ManifestNamespaceMapper extends NamespacePrefixMapper {

private Map prefixMap = new HashMap();

public ManifestNamespaceMapper() {

prefixMap.put("http://www.imsglobal.org/xsd/imsccv1p3/imsccauth_v1p3", "auth");

prefixMap.put("http://ltsc.ieee.org/xsd/imsccv1p3/LOM/manifest", "lomimscc");

prefixMap.put("http://www.imsglobal.org/xsd/imsccv1p3/imscp_v1p1", "");

prefixMap.put("http://www.imsglobal.org/xsd/imsccv1p3/imscsmd_v1p0", "csm");

prefixMap.put("http://ltsc.ieee.org/xsd/imsccv1p3/LOM/resource", "resource");

prefixMap.put("http://www.w3.org/2001/XMLSchema-instance", "xsi");

prefixMap.put("http://canvas.instructure.com/xsd/cccv1p0", "assignment");

}

@Override

public String getPreferredPrefix(String namespaceUri, String suggestion,

boolean requirePrefix) {

return prefixMap.get(namespaceUri);

}

}

以下是生成的XML片段:

xmlns:ns2="http://www.imsglobal.org/xsd/imsccv1p2/imscsmd_v1p0"

xmlns:ns3="http://www.imsglobal.org/xsd/imsbasiclti_v1p0" xmlns:ns4="http://www.imsglobal.org/xsd/imslticm_v1p0"

xmlns:ns5="http://www.imsglobal.org/xsd/imslticp_v1p0" xmlns:ns6="http://www.imsglobal.org/xsd/imslticc_v1p2"

xmlns:ns7="http://ltsc.ieee.org/xsd/imsccv1p3/LOM/manifest" xmlns:ns8="http://ltsc.ieee.org/xsd/imsccv1p3/LOM/resource"

xmlns:ns9="http://www.imsglobal.org/xsd/imsccv1p3/imscp_v1p1"

xmlns:ns10="http://www.imsglobal.org/xsd/imsccv1p3/imscsmd_v1p0"

xmlns:ns11="http://www.imsglobal.org/xsd/imsccv1p3/imsccauth_v1p3"

xmlns:ns12="http://canvas.instructure.com/xsd/cccv1p0" identifier="abcd1234">

IMS Common Cartridge

1.3.0

....

所以,如果您查看上述生成的XML,您会发现有许多不属于此处的命名空间,它们属于不同的XML文件,因为使用了不同的XSD文件。其他生成的XML文件也是如此,我看到所有的命名空间都被插入。

我不确定为什么JAXB2Marshaller会将所有内容复制到每个文件中。是否有办法为每个XML文件分离命名空间和命名空间前缀?

更新:

解决此问题的一种方法是使用不同的配置创建多个Jaxb2Marshaller实例,如此处所述。在类似的线程中,有一个答案建议使用多个contextPath,我已经尝试过了,但没有帮助。

谢谢!

0