2016-06-15 9 views
0

背景オブジェクトに戻って解析することはできません。YEARMONTHフィールドは、フィールド

YearMonthフィールドで、この単純なJavaドメインオブジェクト考えてみましょう:自動的に(

public interface ConsoleRepository extends MongoRepository<Console, String> { 
    Console findByName(@Param("name") String name); 
} 

RESTコントローラーを露出させた場合:

@Getter @Setter 
public class Console { 
    @Id private String id; 
    private String name; 
    private YearMonth releaseMonth; 
    private Vendor vendor; 
} 

をそしてこのドメインオブジェクトはMongoRepository実装によって永続化のために利用できるようになりますこのドメインオブジェクトを管理するために、yearMonth JSON値(例: "2016-04")をjacksonによってこのフィールドに解析するために、jackson-datatype-jsr310 gradle依存関係を追加しました:

compile 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.6.1' 

このエンドポイントにPOSTすると、JSONドキュメントに含まれるYearMonth値が正しくYearMonthフィールドに解析され、オブジェクト全体がMongoDB上のドキュメントとして正常に保存されます。私はRESTコントローラからそのリソースをGETしようとすると、

> db.console.find() 
{ "_id" : ObjectId("575f837ca75df1fc7e5f4f96"), 
    "_class" : "xxx.yyy.Console", 
    "name" : "Console 1", 
    "releaseMonth" : { "year" : 1988, "month" : 10 }, 
    "vendor" : "VENDOR_1" } 

しかし、MongoDBのクライアントはJavaオブジェクトにこのYEARMONTH値をバインドするために失敗します:モンゴでこの文書を検索していることを証明

GET localhost:8080/consoles 

回答:

{ 
    "timestamp": 1465954648903, 
    "status": 500, 
    "error": "Internal Server Error", 
    "exception": "org.springframework.data.mapping.model.MappingException", 
    "message": "No property null found on entity class java.time.YearMonth to bind constructor parameter to!", 
    "path": "/consoles" 
} 

除外されるように思われる、私はビルトインのJava 8のYEARMONTH値のサポートMongoDBのJavaクライアントが欠けていると仮定したいが、それは彼らを救うことができることからです。私はここで何が欠けていますか?

答えて

1

私はCustom Converterを作成することによって、このオブジェクトを解析することができました:

@Component 
public class DBObjectToYearMonthConverter implements Converter<DBObject, YearMonth> { 
    @Override 
    public YearMonth convert(DBObject source) { 
     return YearMonth.of(
      (int) source.get("year"), 
      (int) source.get("month") 
     ); 
    } 
} 

をし、アプリケーションクラスにCustomConversions @Beanを設定:

@Bean 
public CustomConversions getCustomConversions() { 
    return new CustomConversions(Arrays.asList(
     new DBObjectToYearMonthConverter() 
    )); 
} 

その他のオプションは歓迎されています。

+0

私は同じことを試みましたが、動作しませんでしたので、私は日付を見て、私は新しいバージョンを使用していることを認識し、それは反応的であり、私もKotlinを使用しています。問題は単純で、org.bson.DocumentではなくDBObjectを使用していました。タイプを修正した後、コンバータは機能しました。私はちょうどこのタイプのコンバータを以前に作って誰かが新しいバージョンに切り替えることを望んだ場合に備えて、ここに残したかったのです。 – unknown