【问题标题】:mapping of non-iterable to iterable in mapstructmapstruct中不可迭代到可迭代的映射
【发布时间】:2017-11-01 07:52:51
【问题描述】:

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

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

这里abcList<String>

xyzString

但为此我需要明确检查null

有没有更好的方法通过将不可迭代转换为可迭代来将不可迭代映射到可迭代。

【问题讨论】:

    标签: java mapstruct


    【解决方案1】:

    这是一个不可迭代到可迭代的例子:

    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));
    
        }
    
    }
    

    【讨论】:

    • 如果source有两个String属性需要作为Target上的列表怎么办?例如,公共类 Source { private String myFirstString;私有字符串 mySecondString;}
    【解决方案2】:

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

    简而言之,您可以使用自定义方法来进行映射。您也可以使用@Qualifier 进行更精细的控制

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 2022-10-23
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多