尝试将包含有效XML的字符串编组为另一个对象的@XmlValue
属性时,该字符串编码不正确。
对于源字符串:
<person><nickname>Jughead</nickname></person>
marshaller回归:
<person><nickname>Jughead</nickname></person>
(请注意,<
已正确转义为<
,但>
未转义。)
这个问题似乎是依赖于实现的,因为相同的代码按预期工作(返回<person>
等)与默认的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>
我希望有人可以提供帮助!
答案 0 :(得分:0)
XML不需要转义>
,除非它作为序列]]>
的一部分出现。因此,两个序列化都是完全可以接受的。