ModelMapper и LocalDate - Spring Boot

в настоящее время я пытаюсь сопоставить dto с классом, который также содержит атрибут LocalDate. Просто у меня здесь нет успеха, и локальное поле даты всегда остается нулевым. Итак, я создал небольшой пример, в котором я следовал довольно полезным советам из Modelmapper для преобразования от String до LocalDate Итак, у меня есть такой класс ModelMapper:

    @Bean
public ModelMapper createMapper() {
    ModelMapper modelMapper = new ModelMapper();
    modelMapper.createTypeMap(String.class, LocalDate.class);
    Provider<LocalDate> localDateProvider = new AbstractProvider<LocalDate>() {
        @Override
        public LocalDate get() {
            return LocalDate.now();
        }
    };

    Converter<String, LocalDate> toStringDate = new AbstractConverter<String, LocalDate>() {
        @Override
        protected LocalDate convert(String source) {
            DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            LocalDate localDate = LocalDate.parse(source, format);
            return localDate;
        }
    };

    modelMapper.getTypeMap(String.class, LocalDate.class).setProvider(localDateProvider);
    modelMapper.addConverter(toStringDate);
    return modelMapper;
}

Кроме того, у меня есть POJO, в котором есть только 2 поля, идентификатор и локальная дата (без геттеров и сеттеров для удобства чтения.

public class JsonLocalDate {

private Long id;

@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate ld;

public Long getId() {
    return id;
}

И я создал тестовый класс, в котором я попытался имитировать json-часть с помощью LinkedHashMap, поскольку она присутствует в реализованных мною веб-сервисах:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.NONE)
public class ModelMapperTest {

@Autowired
ModelMapper mapper;

String jsonLd = "2018-06-11";

LinkedHashMap<String, String> lhm;

@Before
public void init() {
    lhm = new LinkedHashMap<>();
    lhm.put("id", "1");
    lhm.put("ld", jsonLd);
}

@Test
public void checkModelMapper() {
    assertNotNull(mapper);
    Collection<TypeMap<?, ?>> c = mapper.getTypeMaps();
    assertNotNull(c);
    for (TypeMap<?, ?> typeMap : c) {
        System.out.println("TypeMap : " + typeMap.getConverter().toString());
    }
}

@Test
public void testLocalDate() {
    LocalDate ld = mapper.map(jsonLd, LocalDate.class);
    assertNotNull(ld);
    assertEquals(ld, LocalDate.parse(jsonLd, 
DateTimeFormatter.ofPattern("yyyy-MM-dd")));
}

@Test
public void testLocalDateInObject() {
    JsonLocalDate jld = mapper.map(jsonLd, JsonLocalDate.class);
    assertNotNull(jld);
    assertEquals(jld.getLd(), LocalDate.parse(jsonLd, 
DateTimeFormatter.ofPattern("yyyy-MM-dd")));
}

}

testLocalDate, где я просто сопоставляю String с LocalDate, работает нормально, а testLocalDateInObject не работает.

Кто-нибудь знает, как я должен иметь дело с полями LocalDate, чтобы их сопоставить?

Заранее спасибо !

Ваше здоровье

Joern


person Joern    schedule 01.08.2018    source источник
comment
Возможно, это поможет Json проанализировать LocalDate   -  person Ramon jansen gomez    schedule 01.08.2018


Ответы (1)


Ошибка теста связана с тем, что вы пытаетесь сопоставить строку с объектом, а ModelMapper не знает, как сопоставить строку с объектом.

Поэтому вам следует попробовать сопоставление свойств

modelMapper.typeMap(String.class, JsonLocalDate.class)
    .addMapping(src -> src, JsonLocalDate::setLd);
person Chun Han Hsiao    schedule 02.08.2018
comment
Теперь я понимаю, где мои мысли были неправильными. Я предполагал, что однажды я определяю, как String сопоставляется с LocalDate, и что это затем используется всякий раз, когда имя поля LocalDate совпадает с ключом узла .. Спасибо! - person Joern; 02.08.2018