【问题标题】:Jaxb2Marshaller creating JAXBContext with empty namespace URIJaxb2Marshaller 使用空命名空间 URI 创建 JAXBContext
【发布时间】:2010-07-26 09:25:56
【问题描述】:

使用 Spring 3,我创建了一个 MarshallingView,具有以下编组器:

<bean name="xmlMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshalle r">
    <property name="classesToBeBound">
        <list>
            <value>com.mydomain.xml.schema.Products</value>
        </list>
    </property>
    <property name="marshallerProperties">
        <map>
            <entry key="com.sun.xml.bind.namespacePrefixMapper">
                <bean class="com.mydomain.xml.MyNamespacePrefixMapper"/>
            </entry>
        </map>
    </property>
</bean>

MyNamespacePrefixMapper 应该将 Products 对象(XJC 生成)的模式映射到默认命名空间,但它不会,因为 Jaxb2Marshaller 正在创建一个包含两个不同命名空间 URI 的 JAXBContext。一个是我的架构,另一个是空白字符串。空白字符串会覆盖我分配默认命名空间的任何尝试。

有谁知道为什么会有这个空白字符串,或者我怎样才能摆脱它?

【问题讨论】:

    标签: java spring jaxb


    【解决方案1】:

    您可以尝试使用MOXy JAXB。 Spring 配置保持不变,您只需在模型类中添加一个 jaxb.properties 文件,其中包含以下条目:

    javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
    

    JAXB marshalling problem - probably namespace related。您可以简单地在标准 @XmlSchema 注释上配置命名空间前缀,而不是使用 NamespacePrefixMapper:

    @javax.xml.bind.annotation.XmlSchema( 
        namespace = "http://www.example.org", 
        xmlns = {
            @javax.xml.bind.annotation.XmlNs(prefix = "xsd", namespaceURI = "http://www.w3.org/2001/XMLSchema"),
        },
        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
    package example; 
    

    这会产生如下 XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <process xmlns="http://www.example.org" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
    

    【讨论】:

    • 不幸的是,我的对象是 XJC 生成的,所以我无法手动编辑注释。我不确定我是否可以将属性文件与它们一起放入包中,或者可以将其放在类路径上的任何位置?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2019-12-26
    相关资源
    最近更新 更多