2016-06-15 4 views
0

фона: Мое приложение построено на вершине Spring Data REST и MongoDB Хранилища.годМесяц поле хранится на MongoDB не может быть разобран обратно на объект поля

Рассмотрим этот простой объект домена Java с YearMonth поле:

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

и этот объект домена становится доступным для персистенции по реализации MongoRepository:

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

При экспонировании контроллера REST (автоматически по данным REST) ​​для управления этим доменным объектом, я добавил зависимость gradle, чтобы анализировать значения YearMonth JSON (например: «2016-04») в это поле с помощью jackson:

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

Когда POST'ing к этой конечной точке, значение годМесяца, содержащееся в документе JSON правильно разобран в поле годМесяца и весь объект хранятся в виде документа на MongoDB успешно. Подняв этот документ на Монго доказывает, что:

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

Однако, когда я пытаюсь получить этот ресурс от контроллера REST, MongoDB клиент не связать это значение годМесяца в объект Java:

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" 
} 

Я бы предположить, MongoDB Java клиент не хватает встроенной поддержки для значений годМесяц Java 8, но так как он в состоянии спасти их, что, кажется, исключено. Что мне здесь не хватает?

ответ

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 на классе Application:

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

Другие варианты приветствуются.

+0

Я пробовал то же самое, и он не работал, поэтому я смотрю на дату и понял, что использую более новую версию, и это реактивно, и я даже использую Kotlin. Проблема была простой, используя DBObject вместо org.bson.Document. После исправления типа конвертер работал. Я просто хотел оставить это здесь, если раньше кто-то сделал такой конвертер и хотел перейти на новую версию. – unknown

 Смежные вопросы

  • Нет связанных вопросов^_^