【问题标题】:How JAXB/Jersey unmarshall Boolean values?JAXB/Jersey 如何解组布尔值?
【发布时间】:2013-09-09 12:52:42
【问题描述】:

我遇到了一些 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 下,我得到了一种不同的行为,即大写和小写都按预期解组。

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

提前致谢

【问题讨论】:

标签: glassfish jersey jaxb2 glassfish-4


【解决方案1】:

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

Link to 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;
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 有趣。我们也在使用 2.2,并观察到在 JAXB 绑定发生后,一个布尔字段值为“True”的传入 XML 请求使其变为null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2013-05-10
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    相关资源
    最近更新 更多