java - ModelMapper 处理 java 8 可选 <MyObjectDto> 字段到可选 <MyObject>

标签 java java-8 option-type modelmapper

我一直在应用程序周围使用 modelmapper 和 java 8Options,它们工作得很好,因为它们是原始类型;直到我将模型对象的字段之一更改为可选类型。然后一切都崩溃了。事实证明,许多库不能很好地处理泛型。

结构如下

public class MyObjectDto
{
   private Optional<MySubObjectDto> mySubObject;
}

public MyObject
{
   privae Optional<MySubjObject> mySubObject;
}

当我尝试映射MyObjectDto时至MyObject ,模型映射器调用

public void setMySubObject(Optional<MySubObject> mySubObject){
   this.mySubObject = mySubObject;
}

Optional<MySubObjectDto> ,我不明白这怎么可能(它们之间没有继承)。当然,崩溃得很快。现在我已经改变了我的 setter 以接受 Dto 类型只是为了度过这一天,但这从长远来看是行不通的。有没有更好的方法来解决这个问题,或者我应该创建一个问题?

最佳答案

因此,我深入研究了模型映射器代码,并研究了一些通用实现:

modelMapper.createTypeMap(Optional.class, Optional.class).setConverter(new OptionalConverter());

public class OptionalConverter implements ConditionalConverter<Optional, Optional> {

  public MatchResult match(Class<?> sourceType, Class<?> destinationType) {
    if (Optional.class.isAssignableFrom(destinationType)) {
      return MatchResult.FULL;
    } else {
      return MatchResult.NONE;
    }
  }

  private Class<?> getElementType(MappingContext<Optional, Optional> context) {
    Mapping mapping = context.getMapping();
    if (mapping instanceof PropertyMapping) {
      PropertyInfo destInfo = ((PropertyMapping) mapping).getLastDestinationProperty();
      Class<?> elementType = TypeResolver.resolveArgument(destInfo.getGenericType(),
                                                          destInfo.getInitialType());
      return elementType == TypeResolver.Unknown.class ? Object.class : elementType;
    } else if (context.getGenericDestinationType() instanceof ParameterizedType) {
      return Types.rawTypeFor(((ParameterizedType) context.getGenericDestinationType()).getActualTypeArguments()[0]);
    }

    return Object.class;
  }

  public Optional<?> convert(MappingContext<Optional, Optional> context) {
    Class<?> optionalType = getElementType(context);
    Optional source = context.getSource();
    Object dest = null;
    if (source != null && source.isPresent()) {
      MappingContext<?, ?> optionalContext = context.create(source.get(), optionalType);
      dest = context.getMappingEngine().map(optionalContext);
    }

    return Optional.ofNullable(dest);
  }

}

关于java - ModelMapper 处理 java 8 可选 <MyObjectDto> 字段到可选 <MyObject>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28603853/

相关文章:

java - 如何计算TPS

java - 签名长度不正确 : got 127 but was expecting 128

Java 使用 Collections.reverseOrder() 按值降序排列 TreeMap

java - servlet 如何确定上传何时被取消?

java - 为什么应用的 Font 在 swt 中的 font.dispose() 上被删除?

java 流 : grouping by and add fields

java - Java 什么时候需要显式类型参数?

java-8 - Lombok @Builder.Default 强制默认可选值为 null

java - 可选 vs if/else-if 性能 java 8

ios - if-let 语句不解包可选