2010-11-12 10 views
6

Potrzebuję odwzorować klasę A na klasę C za pomocą struktury spycharki.Mapowanie w trybie spakującym klasy wewnętrzne

public class A { 

private String fielda1; 
private String fielda2; 

public String getFielda1() { 
    return fielda1; 
} 
public void setFielda1(String fielda1) { 
    this.fielda1 = fielda1; 
} 
public String getFielda2() { 
    return fielda2; 
} 
public void setFielda2(String fielda2) { 
    this.fielda2 = fielda2; 
} 
} 


public class B { 
private List<C> cList; 

public List<C> getcList() { 
    return cList; 
} 
public void setcList(List<C> cList) { 
    this.cList = cList; 
} 

public static class C { 
    private String fieldc1; 
    private String fieldc2; 

    public String getFieldc1() { 
     return fieldc1; 
    } 
    public void setFieldc1(String fieldc1) { 
     this.fieldc1 = fieldc1; 
    } 
    public String getFieldc2() { 
     return fieldc2; 
    } 
    public void setFieldc2(String fieldc2) { 
     this.fieldc2 = fieldc2; 
    } 
} 
} 

XML plik odwzorowania:

<mapping wildcard="false" map-null="false" map-id="test"> 
    <class-a>test.A</class-a> 
    <class-b>test.B.C</class-b> 
    <field> 
     <a>fielda1</a> 
     <b>fieldc1</b> 
    </field> 
    <field> 
     <a>fielda1</a> 
     <b>fieldc2</b> 
    </field> 
</mapping> 

Kiedy próbuję map tych klas Dostałem następujący wyjątek:

org.dozer.MappingException: java.lang.ClassNotFoundException: test.B.C 
at org.dozer.util.MappingUtils.throwMappingException(MappingUtils.java:88) 
at org.dozer.util.DefaultClassLoader.loadClass(DefaultClassLoader.java:33) 

szwy że buldożer nie jest w stanie obsłużyć tę sytuację i wykorzystuje klasa B jako nazwa pakietu. Ten problem można rozwiązać za pomocą niestandardowych konwerterów. Po prostu chcę wiedzieć, czy istnieje jakakolwiek sztuczka, która mogłaby zostać użyta do konwersji tych klas przy użyciu tylko konfiguracji XML?

+0

w StackOverflow zwyczajowo przyjmuje odpowiedzi, które pomogły Ci najbardziej. Ponadto zwyczajowo przyjmuje się odpowiedź, która w sposób bardziej wszechstronny pomogła rozwiązać problem. Przekazujesz odpowiedź, używając górnej strzałki po lewej stronie odpowiedzi (liczba głosów wzrośnie o 1). Możesz zaakceptować odpowiedź, klikając znacznik wyboru pod odpowiedzą, aby zmienił kolor na zielony. –

Odpowiedz

22

Spróbuj użyć test.B$C jak w poniższym przykładzie:

<mapping wildcard="false" map-null="false" map-id="test"> 
    <class-a>test.A</class-a> 
    <class-b>test.B$C</class-b> 
    <field> 
     <a>fielda1</a> 
     <b>fieldc1</b> 
    </field> 
    <field> 
     <a>fielda2</a> 
     <b>fieldc2</b> 
    </field> 
</mapping> 

Należy również pamiętać, że zmieniłem drugie pole od fielda1 do fielda2, wydawało się, że to literówka w swoim przykładzie.

Uwaga: Ponieważ ustawienie map-id="test" należy dołączyć mapId kiedy zadzwonić mapę, jak w:

B.C destObject = mapper.map(a, B.C.class, "test"); 

testowałem i to działa prawidłowo:

A.java

package com.test; 

public class A { 

    private String fielda1; 
    private String fielda2; 

    public String getFielda1() { 
     return fielda1; 
    } 

    public void setFielda1(String fielda1) { 
     this.fielda1 = fielda1; 
    } 

    public String getFielda2() { 
     return fielda2; 
    } 

    public void setFielda2(String fielda2) { 
     this.fielda2 = fielda2; 
    } 
} 

B.java

package com.test; 

import java.util.List; 

public class B { 

    private List<C> cList; 

    public List<C> getcList() { 
     return cList; 
    } 

    public void setcList(List<C> cList) { 
     this.cList = cList; 
    } 

    public static class C { 

     private String fieldc1; 
     private String fieldc2; 

     public String getFieldc1() { 
      return fieldc1; 
     } 

     public void setFieldc1(String fieldc1) { 
      this.fieldc1 = fieldc1; 
     } 

     public String getFieldc2() { 
      return fieldc2; 
     } 

     public void setFieldc2(String fieldc2) { 
      this.fieldc2 = fieldc2; 
     } 
    } 
} 

mapping.xml

<?xml version="1.0" encoding="UTF-8"?> 
<mappings xmlns="http://dozer.sourceforge.net" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd"> 

    <mapping wildcard="false" map-null="false" map-id="test"> 
     <class-a>com.test.A</class-a> 
     <class-b>com.test.B$C</class-b> 
     <field> 
      <a>fielda1</a> 
      <b>fieldc1</b> 
     </field> 
     <field> 
      <a>fielda1</a> 
      <b>fieldc2</b> 
     </field> 
    </mapping> 

</mappings> 

Main.java

package com.test; 

import java.util.ArrayList; 
import java.util.List; 

import org.dozer.DozerBeanMapper; 
import org.dozer.Mapper; 

public class Main5 { 

    public static void main(String[] args) throws Exception { 
     List<String> mappingFiles = new ArrayList<String>(1); 
     mappingFiles.add("mapping.xml"); 

     Mapper mapper = new DozerBeanMapper(mappingFiles); 

     A a = new A(); 
     a.setFielda1("fielda1Value"); 
     a.setFielda2("fielda2Value"); 

     B.C destObject = mapper.map(a, B.C.class, "test"); 

     System.out.println(destObject.getFieldc1()); 
     System.out.println(destObject.getFieldc2()); 
    } 

} 

Urządzenie wysyła na konsolę:

... 
fielda1Value 
fielda1Value 
+0

Działa idealnie: D. Dziękuję Ci bardzo. –

+0

@ dino.keco cieszymy się z pomocy. proszę przegłosuj i zaakceptuj odpowiedź zgodnie z konwencjami StackOverflow. Zobacz mój komentarz w powyższym pytaniu. –

Powiązane problemy