在 mapstruct 中将不可迭代映射到可迭代
mapping of non-iterable to iterable in mapstruct
我正在尝试使用 mapstruct 将不可迭代的值(即字符串)映射到字符串列表。
所以我正在使用
@Mapping(target = "abc", expression = "java(java.util.Arrays.asList(x.getY().getXyz()))")
这里abc
是List<String>
xyz
是一个 String
但是为此我需要明确检查 null
。
是否有更好的方法通过将不可迭代对象转换为可迭代对象来将不可迭代对象映射为可迭代对象。
有个iterable-to-non-iterable example in the MapStruct examples repository. Addtionally there is a pending pull request for non-iterable-to-iterable.
简而言之,您可以使用自定义方法来进行映射。您还可以使用 @Qualifier
进行更精细的控制
这是一个不可迭代到可迭代的例子:
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));
}
}
我正在尝试使用 mapstruct 将不可迭代的值(即字符串)映射到字符串列表。 所以我正在使用
@Mapping(target = "abc", expression = "java(java.util.Arrays.asList(x.getY().getXyz()))")
这里abc
是List<String>
xyz
是一个 String
但是为此我需要明确检查 null
。
是否有更好的方法通过将不可迭代对象转换为可迭代对象来将不可迭代对象映射为可迭代对象。
有个iterable-to-non-iterable example in the MapStruct examples repository. Addtionally there is a pending pull request for non-iterable-to-iterable.
简而言之,您可以使用自定义方法来进行映射。您还可以使用 @Qualifier
进行更精细的控制
这是一个不可迭代到可迭代的例子:
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));
}
}