2

クイック イントロ (スキップできます) : こんにちは、このトピックについては多くの質問と回答がありますが、解決策が非常に単純で、考えもしない場合があります。すべての回答に補足を投稿します。

問題 : POST 要求を処理して JSON オブジェクトを保存する JSON REST サービスがありますが、そのオブジェクトには、Genson によってそのままでは解析されない Date フィールドが含まれています。

Java オブジェクト:

public class MyObj {

    // The field you want to serialize/deserialize
    private Date date;

    // Constructor with no arguments needed by Genson
    public MyObj() {}
}

Jersey を使用した REST サービス:

@Path("/api/my-obj")
public class MyObjAPI {

    @POST
    @Consumes("application/json")
    public Response insert(MyObj myObj) {
        // do what you want with myObj, it's ready to use with the date
        return Response.created('url/to/created/object').build();
    }
}

jQuery を使用した JavaScript のクライアント:

// This is the JSON Object to POST
var myObj = {
    date: new Date()
};

$.ajax({
    method: 'POST',
    url: '/api/my-obj',
    data: JSON.stringify(myObj),
    dataType: 'json',
    processData: false,
    contentType: 'application/json'
});
4

1 に答える 1

4

解決 :

Genson は、日付を (逆) シリアル化する方法を定義する簡単な方法を提供します。これは、どこでも見つけることができるソリューションです。

@Provider
public class GensonProvider implements ContextResolver<Genson> {

    private final Genson genson = new GensonBuilder()
            .useDateAsTimestamp(false)
            .useDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"))
            .create();

    @Override
    public Genson getContext(Class<?> type) {
        return genson;
    }
}

重要 :

上記の解決策が機能しない場合は、Java オブジェクトのフィールドの Date タイプが、次のようにインポートされたものであることを確認してください。

import java.util.Date;

ではない:

import java.sql.Date;

私は自分でそれを理解しましたが、StackOverflow のどこにも見つかりませんでした。これは、(私のように) 考えられないほど単純な愚かなエラーです。誰かの助けになることを願っています。

于 2015-07-07T03:24:03.880 に答える