Dozer bidirektionales mapping (String, String) mit custom comverter unmöglich?
Habe ich ein Raupen-mapping mit einem benutzerdefinierten Konverter:
<mapping>
<class-a>com.xyz.Customer</class-a>
<class-b>com.xyz.CustomerDAO</class-b>
<field custom-converter="com.xyz.DozerEmptyString2NullConverter">
<a>customerName</a>
<b>customerName</b>
</field>
</mapping>
Dem Konverter:
public class DozerEmptyString2NullConverter extends DozerConverter<String, String> {
public DozerEmptyString2NullConverter() {
super(String.class, String.class);
}
public String convertFrom(String source, String destination) {
String ret = null;
if (source != null) {
if (!source.equals(""))
{
ret = StringFormatter.wildcard(source);
}
}
return ret;
}
public String convertTo(String source, String destination) {
return source;
}
}
Wenn ich Anrufe, die mapper in eine Richtung (Kunde -> CustomerDAO) die Methode "convertTo' bezeichnet wird.
Seit Dozer ist in der Lage, die bi-direktionale mapping, erwarte ich, dass, sobald ich rufe die mapper in die entgegengesetzte Richtung, die Methode convertFrom' aufgerufen wird.
Aber die Methode convertTo wird nie aufgerufen.
Ich vermute, dass das problem ist, dass beide Typen sind Strings, aber wie kann ich diese Arbeit machen?
Als workaround, ich habe zwei one-way-mapping, ist das die standard Lösung, oder ist das Verhalten ein bug?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, das problem ist, dass Quell-und Ziel-Klassen sind die gleichen. Hier ist der dozer Quelle für
DozerConverter
:Anstatt die
convertFrom
undconvertTo
Methoden (die sind Teil der neuen API), die es tun, die originelle Art und Weise, die Sie implementieren müssen, umCustomConverter.convert
wie gezeigt, in der tutorial.Ich hatte das gleiche problem und derzeit (Raupen-5.5.x) es gibt keinen einfachen Weg, aber es ist Komplex.
Beachten Sie, dass es stützt sich auf keine security-manager aktiviert, die in der JVM, oder sonst müssen Sie einige Berechtigungen in der Sicherheit Regeln. Das ist, weil diese Lösung verwendet reflektion, um Zugriff auf private Felder von Raupen-Klassen.
Müssen Sie erstrecken sich 2 Klassen:
DozerBeanMapper
undMappingProcessor
. Sie müssen auch enum-Element für die Richtung und die Schnittstelle verwenden, um die Richtung vom oben genannten Klassen.Enum:
Schnittstelle:
Die Klasse, die sich
DozerBeanMapper
:Die Klasse, die sich
MappingProcessor
:Nun, die Nutzung.
1) jedes mal, wenn Sie wollen, die Karte der gleichen primitiven Typ (z.B. String-String), verwenden Sie
DozerConverter
mit dieser Art für beide Argumente ein custom-Konverter in Ihrem Raupen-mappings-Datei. Die Umsetzung solcher Konverter erweitern sollten:DozerConverter<String,String>
und implementierenMapperAware
- Schnittstelle. Dies ist wichtig, dass SieMapperAware
verfügbar, da haben die mapper Sie werden in der Lage sein, um Sie zu wirken, umDirectionAware
und dann die Richtung.Beispiel:
2) müssen Sie 2 global Raupen-mapper-Objekte, die eine pro-mapping-Richtung. Sie sollten so konfiguriert werden, mit dem gleichen mapping-Dateien, aber mit unterschiedlicher Richtung-argument. Zum Beispiel:
Natürlich müssen Sie die ordnungsgemäße Verwendung von mapper (von/bis) Angaben zu custom Mapper auf, in welche Richtung Sie kartographierten.
Kam ich in das gleiche Problem nach paar Jahren und irgendwie DozerConverter API, das ist eine neue API, funktioniert immer noch nicht richtig, wie die bi-Richtung !!
So, anstatt sich in all diese komplexen Lösungen geraten hier, ich habe auch 2 one-way-mapping, um über dieses Problem(mit ) . Und dann meine Konvertierungen, die arbeiten . Ich bin mit DozerConverter api wie folgt :
public class MapToStringConverter erstreckt DozerConverter