MOXy JAXB意外地编组了一个@XMLValue

时间:2017-11-21 00:22:29

标签: java xml jaxb moxy

尝试将包含有效XML的字符串编组为另一个对象的@XmlValue属性时,该字符串编码不正确。

对于源字符串:

<person><nickname>Jughead</nickname></person>

marshaller回归:

&lt;person>&lt;nickname>Jughead&lt;/nickname>&lt;/person>

(请注意,<已正确转义为&lt;,但>未转义。)

这个问题似乎是依赖于实现的,因为相同的代码按预期工作(返回&lt;person&gt;等)与默认的Java 8 JAXB实现。

示例代码:

package au.com.schreuder.moxy.test;

import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

public class Main {

    @XmlRootElement(name = "model")
    @XmlAccessorType(XmlAccessType.NONE)
    public static class Model {

        private String value;

        @XmlValue
        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    } 

    public static void main(String[] args) throws Exception {
        System.out.println("moxy.test.main");

        Model model = new Model();
        model.setValue("<person><nickname>Jughead</nickname></person>");

        System.out.println(marshallFragment(model));
    }

    public static String marshallFragment(Object o)
            throws Exception {

        JAXBContext context = JAXBContext.newInstance(o.getClass());
        System.out.println(context.getClass());
        Marshaller m = context.createMarshaller();
        System.out.println(m.getClass());

        m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        StringWriter writer = new StringWriter();
        m.marshal(o, writer);

        return writer.toString();
    }
}

来自pom.xml的完整依赖项:

<dependencies>
    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>org.eclipse.persistence.moxy</artifactId>
        <version>2.6.5</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

我希望有人可以提供帮助!

1 个答案:

答案 0 :(得分:0)

XML不需要转义>,除非它作为序列]]>的一部分出现。因此,两个序列化都是完全可以接受的。