当值为'true'或'false'时,JSON提供程序构建错误的String字段

时间:2012-06-21 20:08:12

标签: json rest jaxb cxf

我有问题。请你帮助我好吗。 我有一个应用程序:CXF + Spring + JAXB + REST。我尝试使用JSONProvider类生成响应 有一个bean类:

@XmlRootElement
class Foo {
@XmlElement
private String bar;
}

当我设置为字段值时:

setBar("true")

setBar("false");

JSONProvider返回给我:

"bar":false

但是,我希望

"bar":"false"

因为我使用字符串类型。我该怎么办?

1 个答案:

答案 0 :(得分:2)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

JAXB(JSR-222)规范不包括JSON绑定。在REST / JAX-RS上下文中,由提供程序将JAXB映射规则应用于JSON表示。今天使用了3种不同的方法:

  1. 将JAXB实现与Jettison之类的库一起使用。 Jettison实现了StAX接口,但解释了JSON。这种方法的优点是它可以与任何JAXB实现一起使用来生成/使用JSON,这种方法的缺点是Jettison没有足够的信息来完成完美的JSON表示。 Jettison收到字符串"true"而不知道相应的Java类型是什么,所以它决定将它表示为JSON布尔值,因为它可能是大多数时候所需的输出。
  2. REST / JAX-RS实现利用特定的JAXB实现来生成JSON。这种方法与第一种类似,只是REST / JAX-RS提供程序对JAXB提供程序进行专有调用,以便对JSON表示应该是什么进行更有根据的猜测。
  3. JAXB实现提供了JSON绑定实现。目前,EclipseLink MOXy是唯一支持JSON绑定的JAXB实现。
  4. MOXy EXAMPLE

    <强>

    以下是包含Stringboolean字段的域对象。我还添加了用@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代码的输出。请注意booleanString属性是如何正确写出的。另请注意@XmlSchemaType注释的使用如何允许我们将boolean编组为String,反之亦然。

    {
       "root" : {
          "barString" : "true",
          "barBoolean" : true,
          "barStringWithXmlTypeBoolean" : true,
          "barBooleanWithXmlTypeString" : "true"
       }
    }
    

    MOXy&amp; JAX-RS

    MOXy包含MOXyJsonProvider,可用于在JAX-RS环境中启用MOXy作为JSON提供程序: