当前位置: 首页 > 知识库问答 >
问题:

ModelMapper和LocalDate-Spring启动

陆洛城
2023-03-14

目前,我正在尝试将dto映射到一个也包含LocalDate属性的类。只是我在这里没有成功,本地日期字段始终保持为空。因此,我构建了一个简短的示例,其中我遵循Modelmapper提供的非常有用的提示,将字符串转换为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,它只有两个字段,一个id和一个本地日期(不带getter和setter)。

public class JsonLocalDate {

private Long id;

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

public Long getId() {
    return id;
}

我创建了一个测试类,在那里我试图通过LinkedHashMap模拟json部分,因为它出现在我实现的网络服务中:

@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个答案

淳于博文
2023-03-14

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

所以你应该试试财产测绘

modelMapper.typeMap(String.class, JsonLocalDate.class)
    .addMapping(src -> src, JsonLocalDate::setLd);
 类似资料:
  • 我的DTO具有字符串格式的日期字段。我的实体有日期为LocalDate。目前,我从map跳过它,然后手动显式设置它(字符串到日期,反之亦然)。 可以自动转换吗?我尝试在Springbean中使用Converter,但它给了我很多编译错误(类型转换器不接受参数,不重写convert方法-convert()也有很多错误)。 我对modelmapper不是很熟悉。非常感谢您的帮助。 正如我建议的那样,我

  • 我正在开发Spring Boot Rest Api。我有一门课叫"Wypozyczenie",还有一门课叫"WypozyczenieDTO"。我想从类Wypozyczenie(避免嵌套对象)中提取一些信息,并根据WypozyczenieDTO的信息返回数据。我试过DozerBeanMapper和ModelMapper,两者都没有正确转换我的对象。所有的值都是空或零!我正在调试,在应该做我的转换的行

  • ModelMapper,Java Object Mapping 工具,类似BeanUtils,效率略低于Orika,但是内部策略丰富,配置方式更舒适。

  • 如何正确设置推土机6.4.1或ModelMapper 2.2.0的映射,以成功映射java。时间LocalDate字段到java。util。日期字段,反之亦然? 考虑以下类别: 然后调用映射器。map(fooInstance,Bar.class) 无效。 我尝试过创建和注册自定义转换器。使用Dozer,我创建了扩展

  • 有没有办法检查Spring框架和Springboot版本的兼容性? 我最近从Spring v4.3.20. RELEASE切换到Spring v5.2.20. RELEASE和Spring v1.5.17到v2.1.10. RELEASE现在,我面临着许多兼容性问题。我很难找出兼容的版本。 请帮忙

  • 我目前正在尝试使用ModelMapper的映射方法执行实体到DTO的映射。在最深的属性映射上,映射结果为null,但它应该是一个对象。 以下是我的映射源实体(省略brevety的Loombok getter和setter): 以下是我的目标DTO(省略brevety的Loombok Getter和Setter): 在我的Controller类方法上,我这样做映射: My clientService