2017-11-01 5 views
0

Ich versuche, einen nicht-iterablen Wert, d. H. Zeichenfolge zu einer Liste der Zeichenfolge mit Mapstruct zuordnen. Also ich bin mitMaping von nicht-iterable zu iterable in mapsstruct

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

Hier abc ist List<String>

xyz ein String

ist aber dafür muss ich für null explizit überprüfen.

Gibt es eine bessere Möglichkeit, ein nicht iterierbares zu iterieren, indem nicht iterierbares in iterbares umgewandelt wird.

Antwort

1

Hier mehr granural Kontrolle zu haben verwenden ist ein Beispiel für nicht iterable-to-iterable:

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

    } 

} 
0

Es gibt ein iterable-to-non-iterable Beispiel im MapStruct-Beispielrepository. Zusätzlich gibt es eine ausstehende Pull-Anfrage für non-iterable-to-iterable.

Kurz gesagt, Sie können eine benutzerdefinierte Methode verwenden, die das Mapping durchführen würde. Sie können @Qualifier auch