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

时间:2018-01-31 15:19:00

标签: java spring jaxb jaxb2 jaxb2-maven-plugin

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

@Bean
public Marshaller ltiMarshaller() {
    Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();

    Map<String,Object> map = new HashMap<String,Object>();
    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<String, String> prefixMap = new HashMap<String, String>();

   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代码段:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns9:manifest xmlns="http://ltsc.ieee.org/xsd/imsccv1p3/LOM/imscclti"
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">
<ns9:metadata>
    <ns9:schema>IMS Common Cartridge</ns9:schema>
    <ns9:schemaversion>1.3.0</ns9:schemaversion>
    <ns7:lom>....

因此,如果您查看上面生成的XML,您会发现有许多名称空间不属于此处,由于XSD文件不同,它们属于不同的XML。与其他生成的XML文件的情况相同,我看到所有名称空间都被插入。

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

更新

防止此问题的一种方法是使用提到的here创建具有不同配置的多个Jaxb2Marshaller实例。在类似的帖子中,有一个答案表明我已经做过多次contextPath,但没有帮助。

谢谢!

0 个答案:

没有答案