Java可选getter在modelmapper中不起作用

时间:2019-07-04 09:11:57

标签: java spring-boot modelmapper

无法使用ModelMapper将dto类转换为dto类。

NB:我不想使用getter / setter。我只想使用Optional吸气剂

示例:

class A {      
    Long id;

    public Optional<Long> getId() {
       return Optional.ofNullable(id);
    }
}

另一堂课:

class B {
    Long id;
    // getter and setter
}

转换器:

B f(A a) {
  new ModelMapper.map(a, B.class);
}

错误:failed to convert java.util.Optional to java.lang.Long.\n\n1 error

3 个答案:

答案 0 :(得分:1)

我想,映射器只是通过反射,构建获取器来扫描字段,并且期望与字段类型具有相同的返回类型。

这就是为什么它无法将Long强制转换为Optional<Long>的原因。

作为解决方法,您可以使字段Optional<Long>本身。

或者,甚至更好,就是不要在POJO getter中返回可选值。

答案 1 :(得分:1)

我认为Converter可以为您提供帮助。

Converter<String, String> toUppercase = new AbstractConverter<String, String>() {
  protected String convert(String source) {
    return source == null ? null : source.toUppercase();
  }
};

在这里http://modelmapper.org/user-manual/converters/进行检查,您只需将一个字符串替换为Optional,将第二个字符串替换为Long

答案 2 :(得分:0)

可选对象:.get()

示例:

   @GetMapping("/{id:[0-9]+}")
   LanguageDto getLanguageById(@PathVariable Long id) {

     Optional<Language> lang = service.findById(id);
     if (lang.isPresent()) {
        return modelMapper.map(lang.get(), LanguageDto.class);
     } else {
        throw new EntitySimpleNotFoundException("Language", id);
     } 
 }

-> modelMapper.map(lang.get(), LanguageDto.class)