ModelMapper和LocalDate-Spring Boot

时间:2018-08-01 11:04:30

标签: java json spring-boot mapping modelmapper

当前,我正在尝试将dto映射到也包含LocalDate属性的类。仅仅我在这里没有成功,本地日期字段始终为空。因此,我建立了一个简短的示例,其中我遵循了Modelmapper to convert from String to 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个字段,一个id和一个本地日期(出于可读性考虑,不带getter和setter)。

public class JsonLocalDate {

private Long id;

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

public Long getId() {
    return id;
}

然后我创建了一个测试类,在其中我尝试通过LinkedHashMap模拟json部分,因为它已经实现了Web服务:

@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")));
}

}

我将字符串映射到LocalDate的testLocalDate正常工作,而testLocalDateInObject失败。

有人知道我必须如何处理LocalDate字段才能将它们映射吗?

谢谢!

欢呼

琼恩

1 个答案:

答案 0 :(得分:0)

测试失败是因为您试图将字符串映射到对象,而ModelMapper不知道如何将字符串映射到对象。

所以您应该尝试Property Mapping

modelMapper.typeMap(String.class, JsonLocalDate.class)
    .addMapping(src -> src, JsonLocalDate::setLd);