1

我有一些 RESTful 服务的问题,这些服务在参数中采用传输对象(基本上是一个 XML 对象,它将被解组到 POJO)。

@XmlRootElement(name = "myPojo")
public class MyPojo {
    @XmlElement(name = "myField")
    private Boolean myBoolean;

    public void setMyBoolean(Boolean bool) {
        myBoolean = bool;
    }

    public Boolean getMyBoolean()  {
        return myBoolean;
    }
}

服务是这样的:

public class MyRestService {

    @PUT
    @Path("somewhere")
    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public Response update(MyPojo pojo) {
        System.out.println("Boolean value: " + pojo.getMyBoolean();
    }
}

如果我发布这个 XML 片段:

<myPojo>
    <myField>false</myField>
</myPojo>

我有:

Boolean value: false

如果我发布这个 XML 片段:

<myPojo>
    <myField>FALSE</myField>
</myPojo>

我有:

Boolean value: null

我在带有 Jersey 1.9.1 和 JAXB 2.2.7 的 Glassfish 4 下运行该代码。此外,在 Glassfish 2 下,我得到了一种不同的行为,即大写和小写都按预期解组。

所以,我真的很想知道发生了什么以及为什么布尔值的编组不同。

提前致谢

4

2 回答 2

3

我今天遇到了同样的问题,JAXB 在解析布尔字段上的“FaLsE”或“True”时返回 null。不幸的是,升级到 2.2.7 或更高版本(截至今天为 2.2.11)并没有帮助我。当我深入研究源代码时,似乎解析逻辑发生在 DatatypeConverterImpl.java 内部。并且没有任何配置可以改变其大写的行为。

链接到 JAXB DatatypeConverterImpl.java

我找到(并且有效)的解决方案是定义一个新的 BooleanAdapter 并要求 JAXB 使用它。在适配器中,您可以定义适合您的应用程序的任何转换逻辑。

自定义 BooleanAdapter.java

public class BooleanAdapter extends XmlAdapter<String, Boolean> {

    @Override
    public Boolean unmarshal(String v) throws Exception {
        if (StringUtils.isBlank(v))
            return null;
        return Boolean.valueOf(v);
    }

    @Override
    public String marshal(Boolean v) throws Exception {
        if (v == null)
            return null;
        return v.toString();
    }
}

你的模型对象

@XmlElement(name = "myField")
@XmlJavaTypeAdapter(BooleanAdapter.class)
public Boolean getMyBoolean() {
    return myBoolean;
}
于 2014-10-31T21:42:01.437 回答
1

经过多次调查,我们发现我们正在使用的 JAXB 2.2 版本似乎包含一个错误,该错误导致布尔值序列化不符合预期。我的意思是,例如: FaLsE 将被转换为空值。

升级到 2.2.7 版本解决了我们的问题。

于 2013-09-25T13:48:57.190 回答