代码之家  ›  专栏  ›  技术社区  ›  Vijayant Bhatia

mapstruct中不可iterable到iterable的映射

  •  1
  • Vijayant Bhatia  · 技术社区  · 8 年前

    我试图使用mapstruct将一个不可iterable值(即字符串)映射到一个字符串列表。

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

    在这里 abc List<String>

    xyz String

    但是我需要检查一下 null 明确地

    有没有更好的方法将不可iterable转换为可iterable。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Pablo García    8 年前

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

    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));
    
        }
    
    }
    
        2
  •  2
  •   Filip    8 年前

    有一个 iterable-to-non-iterable MapStruct示例库中的示例。此外,还有一个挂起的pull请求 non-iterable-to-iterable .

    简而言之,您可以使用自定义方法进行映射。您也可以使用 @Qualifier 拥有更多的控制权