1

パラメータで転送オブジェクト (基本的には、POJO にアンマーシャリングされる XML オブジェクト) を受け取る RESTful サービスに問題があります。

@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

今日、ブールフィールドで「FaLsE」または「True」を解析するときにJAXBが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 は null 値に変換されます。

バージョン 2.2.7 にアップグレードすると、問題が修正されました。

于 2013-09-25T13:48:57.190 に答える