尝试使用Eclipse Moxy将类封送到JSON时遇到了一个非常恼人的错误。
我的一个域类中有一个具有以下值的属性:"the City’s original city site"
,其中包含代码点u + 2019(')
当Jaxb试图编组这个值时,我莫名其妙地找回了一个奇怪的控件:"Citys original city site"
这导致无效的JSON在解码时返回空值。我和杰克逊一起尝试了这个,并且收到了一个ascii转义字符,这仍然是错误的,但它至少会产生有效的JSON!
Moxy应该能够正确输出,因为'是一个有效的unicode字符,并且在JSON中有效。我能做些什么来正确输出'(和任何其他unicode字符),最好将这个不必要的字符转换为常规撇号。
这是我的提供者类:
@Provider
@Component("customMOXyJsonProvider")
public class CustomMOXyJsonProvider extends MOXyJsonProvider {
@Override
protected void preWriteTo(Object object, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders, Marshaller marshaller)
throws JAXBException {
marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING,"UTF-8");
}
}
我正在使用Moxy的2.5.1版本。
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.5.1</version>
</dependency>
我的系统中有几个组件理论上可能搞砸了这些值(postgres,jdbc,hibernate,cxf和tomcat),但我已经通过测试确定该值是在我的域类中正确存储的 - 然后被破坏了,就像Elliot Spitzer在编组阶段一样嫖娼。
答案 0 :(得分:3)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。
现在已在EclipseLink 2.5.2和2.6.0流中修复了该问题。您可以从以下位置下载2013年10月10日开始的每晚构建:
或者来自Maven
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.5.2-SNAPSHOT</version>
</dependency>
和
<repository>
<id>oss.sonatype.org</id>
<name>OSS Sonatype Staging</name>
<url>https://oss.sonatype.org/content/groups/staging</url>
</repository>
以下错误可用于跟踪我们在此问题上的进展:
您在EclipseLink 2.5.0中使用案例。我们在EclipseLink 2.5.1中进行的性能修复引入了失败:
我们对OutputStream
的编组似乎存在一个错误,在我们编组Writer
中的JSON(XML无法正常工作)中不存在这个错误。以下是我的快速调查发现的内容。我得到更多信息后,我会更新我的答案。
Java模型
public class Foo {
private String bar;
public String getBar() {
return bar;
}
public void setBar(String bar) {
this.bar = bar;
}
}
演示代码
import java.io.OutputStreamWriter;
import java.util.*;
import javax.xml.bind.*;
import javax.xml.bind.Marshaller;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
JAXBContext jc = JAXBContext.newInstance(new Class[] {Foo.class}, properties);
Foo foo = new Foo();
foo.setBar("the City’s original city site");
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// Broken
marshaller.marshal(foo, System.out);
// Works
marshaller.marshal(foo, new OutputStreamWriter(System.out));
}
}
<强>输出强>
{
"bar" : "the Citys original city site"
}{
"bar" : "the City’s original city site"
}