可以在Orika中将List索引指定为可选吗?

时间:2016-12-16 23:03:57

标签: java collections orika

我尝试使用Orika将一种类型的地址对象映射到更简单的类型但遇到了一个问题,如果我的列表中没有至少与I'一样多的元素,我会得到一个IndexOutOfBounds异常。我在我的映射器中指定。

以下是我的示例对象:

public class SourceAddress {
    List<String> addressLines;
}

public class DestinationAddress {
    String address1;
    String address2;
    String address3;
}

这是我的映射器:

mapperFactory.getMapperFacade().map(SourceAddress.class, DestinationAddress.class)
    .field("addressLine[0]", "address1")
    .field("addressLine[1]", "address2")
    .field("addressLine[2]", "address3")
    .mapNulls(false)
    .byDefault()
    .register();

但在我的例子中,源地址中的列表只有两个字符串。我希望有一种方法可以选择映射address3字段,但我似乎无法在Orika单元测试中找到一个例子。

我尝试映射并获得异常时得到的输出是:

Error occurred: java.lang.IndexOutOfBoundsException: Index: 2, Size: 2

是否有人知道这是否可以通过简单的方式实现,还是我必须为此类型编写CustomMapper?

1 个答案:

答案 0 :(得分:0)

只需创建&#34;一个ConverterClass&#34; :

public class NoopConverter extends CustomConverter<String, String> {

  @Override
  public String convert(String source, Type<? extends String> destinationType, MappingContext mappingContext) {
    return source;
  }
}

并在Mapper中:

 @Override
 public void configure(MapperFactory factory) { 

 factory.getConverterFactory()
        .registerConverter(new NoopConverter());

 factory.classMap (SourceAddress.class, DestinationAddress.class)
        .field("addressLine[0]", "address1")
        .field("addressLine[1]", "address2")
        .field("addressLine[2]", "address3")
        .byDefault()
        .register();
}