1

Jackson によって逆シリアル化される JSON を送信するときに、サブ要素の最後の値が である場合null、Jackson は逆シリアル化を中止するようです。


悪い:

この JSON を受信者 (以下) に送信すると、逆シリアル化が で停止するため、マップされたContentオブジェクトは になります。nullimage

{"user":{"id":"1", "token":"ABC", "image":null},"content":{"id":"2"}}

良い:

このように送信すると、必要な値が保持されますが、imageオブジェクトはその ID で作成されます。nullContent

{"user":{"id":"1", "image":null, "token":"ABC"},"content":{"id":"2"}}

これは私にはバグのように見えます..?!


シンプルなレシーバー:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Transactional
public Response create(UserContent source) {
        UserContent dbResult = manager.create(source);
        return Response.status(200)
                .entity(dbResult.getId().toString()).build();
}

シリアライザ

 public static String objectToString(Object object) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"));

        Writer strWriter = new StringWriter();
        try {
            mapper.writeValue(strWriter, object);
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
        String userDataJSON = strWriter.toString();

        return userDataJSON;
    }

送信側ですべてをオブジェクトnullとして、または空のオブジェクトとしてシリアル化するように ObjectMapper を設定できますか?""

UserContentプロパティを持つオブジェクトを上記のメソッドに渡すnullと、結果の JSON はnull上記の例のような値になり、リストの最後の項目の値が null の場合、逆シリアル化が中止され、バックエンドで NullPointerExceptions が発生します。


編集 - UserContent クラス:

@Entity
@Table(name = "user_content")
@XmlRootElement
public class UserContent extends org.springframework.data.jpa.domain.AbstractPersistable<Long> {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    @Fetch(FetchMode.JOIN)
    private User user;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "content_post_id", nullable = false)
    @Fetch(FetchMode.JOIN)
    private Contentcontent;

    // more properties...
}

私たちの依存関係:

<properties>
    <jersey-version>1.14</jersey-version>
</properties>
            <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.5</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>${jersey-version}</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>${jersey-version}</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>${jersey-version}</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-multipart</artifactId>
        <version>${jersey-version}</version>
    </dependency>


    <dependency>
        <groupId>com.sun.jersey.jersey-test-framework</groupId>
        <artifactId>jersey-test-framework-grizzly2</artifactId>
        <version>${jersey-version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-servlet</artifactId>
        <version>${jersey-version}</version>
        <scope>test</scope>
    </dependency>
4

2 に答える 2

0

この奇妙な動作に対する現在の解決策は、 :を構成することにより、シリアル化のすべてのnull値を無視することです。ObjectMapper

mapper.setSerializationInclusion(Inclusion.NON_NULL);

双方をコントロールしながらできること。RESTサービスを公開する場合に備えて、上記のように着信null値のコンステレーションを実際に処理する方法についてはまだ興味があります。

于 2012-11-26T05:29:18.923 に答える
-2

ジャージを使用しているとします。サーバー側でjacksonをGensonに置き換えてみると、問題が解決するはずです。確かにそれはバグのように見えます。jackson と jersey-json は必ず削除してください。Genson で json サポートを有効にするための構成は必要ありません。クラスパスに jar をドロップするだけです。

于 2012-11-25T18:29:43.063 に答える