2016-04-04 4 views
1

Ich habe eine Klasse, nennen wir es A mit einem Map-Feld, das in Klasse B konvertiert wird, die ich für Datenbankspeicherung/retrieval verwendet, in dem das Feld auf eine Zeichenfolge zugeordnet ist. Das Mapping funktioniert perfekt von A nach B. Wenn ich jedoch von B nach A gehe, erhalte ich eine IllegalArgument-Ausnahme, die besagt, dass ein String nicht in eine Map umgewandelt werden kann. Verwirrt mich, weil Dozer's documentation sagt, dass dies funktioniert, wo es heißt:Zuordnen einer Zeichenfolge zu einer Karte über Dozer

Datentyp Coversion wird automatisch von der Dozer-Mapping-Engine durchgeführt. Derzeit unterstützt Dozer die folgenden Arten von Konvertierungen: (diese sind alle bidirektional)

Und dann geht es weiter, um String zu Map als eines der möglichen Dinge aufzulisten.

Was fehlt mir hier, oder was muss ich speziell machen? Meine Dateien wie folgt aussehen:

public class ClassA { 
    Map<String, String> field; 

    public Map<String, String> getField() { 
     return field; 
    } 
    public void setField(
      Map<String, String> field) { 
     this.field = field; 
    } 
} 

public class ClassB { 
    String field; 

    public String getField() { 
     return field; 
    } 
    public void setField(String field) { 
     this.field = field; 
    } 
} 

<mapping> 
    <class-a>com.fake.company.name.ClassA</class-a> 
    <class-b>com.fake.company.name.ClassB</class-b> 
</mapping> 
+0

Sehr interessant. Vielleicht sind sie "Map to Map", weil ich so etwas in dieser Liste nicht sehe und das ist definitiv möglich. –

+0

Ich habe ein Problem angesprochen - https://github.com/DozerMapper/dozer/issues/283. Natürlich ist das Mapping zumindest nicht automatisch. –

+0

@ShireResident nicht sicher, dass ein Thema wert ist, wie Marti darauf hingewiesen hat, ist die Lösung, das Feld einfach explizit zu deklarieren. – Atocil

Antwort

1

Von Map Based Properties section (classes used in documentation) scheint es, dass explizit die Abbildung der Felder ist erforderlich, weil der Feldname als Schlüssel für die Karte verwendet wird.

<mapping> 
    <class-a>com.fake.company.name.ClassA</class-a> 
    <class-b>com.fake.company.name.ClassB</class-b>  
    <field> 
    <a>field</a> 
    <b>field</b> 
    </field> 
</mapping> 

können Sie anderen Wert für die wie Schlüssel verwenden, so

<a key="someKeyValue">field</a> 

Allerdings, wenn Ihre Karte mehrere Schlüssel-Wert-Paare hat, werden Sie wahrscheinlich einen benutzerdefinierten Konverter benötigen (see here for details), da sonst Dozer nicht hat Idee, wie man die ursprüngliche Karte von der Schnur wieder herstellt.

+0

Das hat funktioniert, es gibt mir nicht mehr die Ausnahme und tatsächlich rekonstruiert es die Karte ziemlich gut, sogar mit mehreren Schlüssel-Wert-Paaren! Aus irgendeinem Grund führt die Konvertierung von Map in String jedoch zu einem Ergebnis von null. – Atocil

Verwandte Themen