我有问题。请你帮助我好吗。
我有一个应用程序:CXF + Spring + JAXB + REST。我尝试使用JSONProvider
类生成响应
有一个bean类:
@XmlRootElement
class Foo {
@XmlElement
private String bar;
}
当我设置为字段值时:
setBar("true")
或
setBar("false");
JSONProvider返回给我:
"bar":false
但是,我希望
"bar":"false"
因为我使用字符串类型。我该怎么办?
答案 0 :(得分:2)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。
JAXB(JSR-222)规范不包括JSON绑定。在REST / JAX-RS上下文中,由提供程序将JAXB映射规则应用于JSON表示。今天使用了3种不同的方法:
"true"
而不知道相应的Java类型是什么,所以它决定将它表示为JSON布尔值,因为它可能是大多数时候所需的输出。MOXy EXAMPLE
<强> 根 强>
以下是包含String
和boolean
字段的域对象。我还添加了用@XmlSchemaType
注释的字段,可用于覆盖默认表示。
package forum11145933;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
String barString;
boolean barBoolean;
@XmlSchemaType(name="boolean")
String barStringWithXmlTypeBoolean;
@XmlSchemaType(name="string")
boolean barBooleanWithXmlTypeString;
}
<强> jaxb.properties 强>
要将MOXy指定为JAXB提供程序,您需要在与域模型相同的程序包中添加名为jaxb.properties
的文件,并使用以下条目:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
<强> 演示 强>
以下代码演示了如何将域对象编组为JSON。请注意,MOXy没有编译时依赖性。
package forum11145933;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Root root = new Root();
root.barString = "true";
root.barBoolean = true;
root.barStringWithXmlTypeBoolean = "true";
root.barBooleanWithXmlTypeString = true;
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty("eclipselink.media-type", "application/json");
marshaller.marshal(root, System.out);
}
}
<强> 输出 强>
以下是运行Demo
代码的输出。请注意boolean
和String
属性是如何正确写出的。另请注意@XmlSchemaType
注释的使用如何允许我们将boolean
编组为String
,反之亦然。
{
"root" : {
"barString" : "true",
"barBoolean" : true,
"barStringWithXmlTypeBoolean" : true,
"barBooleanWithXmlTypeString" : "true"
}
}
MOXy&amp; JAX-RS 强>
MOXy包含MOXyJsonProvider
,可用于在JAX-RS环境中启用MOXy作为JSON提供程序: