在mapstruct中将非迭代映射到可迭代

时间:2017-11-01 07:52:52

标签: java mapstruct

我正在尝试使用mapstruct将不可迭代的值(即String)映射到字符串列表。 所以我正在使用

@Mapping(target = "abc", expression = "java(java.util.Arrays.asList(x.getY().getXyz()))")

此处abcList<String>

xyzString

但为此,我需要明确检查null

是否有更好的方法可以通过将非迭代转换为可迭代来将非迭代变为可迭代。

2 个答案:

答案 0 :(得分:2)

以下是非可迭代到可迭代的示例:

public class Source {

    private String myString;

    public String getMyString() {
        return myString;
    }

    public void setMyString(String myString) {
        this.myString = myString;
    }

}

public class Target {

    private List<String> myStrings;

    public List<String> getMyStrings() {
        return myStrings;
    }

    public void setMyStrings(List<String> myStrings) {
        this.myStrings = myStrings;
    }   

}

@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface FirstElement {
}

public class NonIterableToIterableUtils {

     @FirstElement
        public List<String> first(String in ) {
            if (StringUtils.isNotEmpty(in)) {
                return Arrays.asList(in);

            } else {
                return null;
            }
        }

}

@Mapper( uses = NonIterableToIterableUtils.class )
public interface SourceTargetMapper {

    SourceTargetMapper MAPPER = Mappers.getMapper( SourceTargetMapper.class );

    @Mappings( {
        @Mapping( source = "myString", target = "myStrings", qualifiedBy = FirstElement.class )
    } )
    Target toTarget( Source s );
}

public class Main {

    public static void main(String[] args) {
        Source s = new Source();
        s.setMyString("Item");

        Target t = SourceTargetMapper.MAPPER.toTarget( s );
        System.out.println( t.getMyStrings().get(0));

    }

}

答案 1 :(得分:0)

MapStruct示例存储库中有一个iterable-to-non-iterable示例。另外还有non-iterable-to-iterable的待处理拉取请求。

简而言之,您可以使用可以执行映射的自定义方法。您还可以使用@Qualifier进行更多的肉食控制