使用Spring Jaxb2Marshaller生成动态命名空间前缀

时间:2016-11-01 14:08:21

标签: java spring-boot jaxb jaxb2 spring-oxm

我使用Spring Jaxb2Marshaller将java对象转换为XML,反之亦然。我需要为xmlns prefixvalue设置动态值 - 意味着,考虑到示例

xmlns:abc="http://www.example.com"

其中prefixabc value http://www.example.com必须是可配置的(从属性文件提供)。

请参阅包Product

下的类com.test.abc的示例xml
<abc:Product 
    xmlns:abc="http://www.example.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <abc:productId>252</abc:productId>
    <abc:productName>XYZ</abc:productName>
</abc:Product>

要构建此xml,我使用以下配置

Spring Jaxb2Marshaller Bean配置

@Bean
public Jaxb2Marshaller getJaxb2Marshaller(){
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan("com.test.abc", "com.test.xyz");
    Map<String,Object> propertiesMap = new HashMap<String,Object>();
    propertiesMap.put("jaxb.formatted.output", true);
    marshaller.setMarshallerProperties(propertiesMap);
    return marshaller;
}

pack-info.java

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://www.example.com", 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
    xmlns = { @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.example.com", prefix="abc")})
package com.test.abc;

这里我是硬编码的xmlns前缀和值。我需要供应 xmlns前缀和属性文件中的值。我怎么能做到这一点?

我正在使用SpringBoot 1.3.3

1 个答案:

答案 0 :(得分:0)

注释为difficult

我能想到的唯一(和IDE不友好的)方式是:

  • 使用&#34;代码替换&#34; (作为构建生命周期的一部分...将值过滤到注释占位符中)
  • ...或者使用一些(预编译!?)&#34;注释工具&#34; (正如其中一个answers所提议的那样)。
另一方面,

(自定义)NamespacePrefixMapper将清除所有这些基于注释的限制/问题,并能更好地处理(运行时/弹簧)属性。

simplespring based示例。

希望你成功!