2

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

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

当我设置为字段值时:

setBar("true")

或者

setBar("false");

JSONProvider 返回给我:

"bar":false

但是,我期待

"bar":"false"

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

4

1 回答 1

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 类型是什么的情况下接收到 String,因此它决定将其表示为 JSON 布尔值,因为大多数情况下它可能是所需的输出。
  2. REST/JAX-RS 实现利用特定的 JAXB 实现来生成 JSON。这种方法与第一种方法类似,除了 REST/JAX-RS 提供者对 JAXB 提供者进行专有调用,以对 JSON 表示应该是什么做出更有根据的猜测。
  3. JAXB 实现提供了 JSON 绑定实现。目前 EclipseLink MOXy 是唯一支持 JSON 绑定的 JAXB 实现。

莫西示例

下面是一个带有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注释的使用如何允许我们将 a 编组boolean为 a String,反之亦然。

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

MOXy & JAX-RS

MOXy 包括MOXyJsonProvider可用于在您的 JAX-RS 环境中启用 MOXy 作为 JSON 提供程序的功能:

于 2012-06-22T17:08:42.783 回答