2016-05-31 8 views
2

Ich benutze Orika 1.4.6 und ich möchte einen CustomConverter verwenden, um eines meiner Felder zuzuordnen. Wenn das Quellfeld null ist, scheint der Konverter nicht aufgerufen zu werden. Hier ist mein Code:Orika: CustomConverter nicht auf null Werte

class From { 
    String source; 
} 

class To { 
    String destination = "defaultValue"; 
} 

public class Mapper extends ConfigurableMapper { 

    private class MyConverter extends CustomConverter<String, String> { 

    @Override 
    public String convert(String source, Type<? extends String> destinationType) { 
     if (null == source) { 
     return "NULL!"; 
     } 
     return "->" + source + "<-"; 
    } 
    } 

    @Override 
    protected void configure(MapperFactory factory) { 

    factory.getConverterFactory().registerConverter("converter", new MyConverter()); 

    factory.classMap(From.class, To.class) 

     .fieldMap("source", "destination") 
     .mapNulls(true) 
     .converter("converter") 
     .add() 

    .register(); 
    } 
} 

Wenn ich Karte folgendes Objekt:

From from = new From(); //from.source == null 

Mapper mapper = new Mapper(); 
To to = mapper.map(from, To.class); 

System.out.println(to.destination); 

ich die folgende Ausgabe erwarten:

NULL! 

Jedoch bekomme ich folgende:

null 

was darauf hindeutet, dass der Konverter ist gar nicht und der Nullwert wird einfach kopiert, wegen

.mapNulls(true) 

genannt Wenn ich jetzt

.mapNulls(false) 

das Problem bleibt das gleiche gesetzt, wie der Nullwert im Quellfeld wird ignoriert was das Zielfeld unverändert lässt (in diesem Fall mit dem Wert "defaultValue").

Es wäre zum Beispiel möglich, die "anpassen" -Methode in Kombination mit einem CustomMapper zu verwenden. Allerdings ist diese Lösung in meiner realen Anwendung viel komplexer und daher scheint die Lösung mit dem CustomConverter viel geeigneter zu sein.

Weiß jemand, wo das Problem in diesem konkreten Beispiel ist?

Cheers, Robert

+0

Ich benutze einen CustomMapper eine akzeptable Lösung für Sie? – Akah

+0

Die Lösung mit einem CustomMapper funktioniert und ist korrekt. Ich denke jedoch, dass die oben skizzierte Lösung auf lange Sicht einfacher und einfacher zu pflegen wäre. Außerdem bin ich neugierig, ob dieses Verhalten beabsichtigt ist oder nicht. – Robert

+0

Es wäre eine gute Lösung, aber ich glaube nicht, dass Konverter verwendet werden, wenn die Quelle "null" ist. Ein CustomMapper ist möglicherweise Ihre einzige Option, aber überlegen Sie, ob Sie den Betreuer fragen. Zuletzt habe ich überprüft, ob sie in einer Google-Mailingliste für das Projekt aktiv waren. – kab

Antwort

1

Das beobachtete Verhalten ist beabsichtigt.

Anstatt einen benutzerdefinierten Konverter zu verwenden, der Nullwerte verarbeitet, ist es möglich, eine ObjectFactory zu erstellen, die die Objekterstellung behandelt. Hier können wir die Standardwerte festlegen und sie bei Bedarf überschreiben (d. H. Wenn ein Nicht-Null-Objekt zugeordnet ist) im benutzerdefinierten Konverter. Beachten Sie, dass hier haben wir

.mapNulls(false) 

für diese Arbeit zu setzen.

Danke an Elaatifi von Orika für diese Lösung!