2010-11-12 42 views
6

Tôi cần ánh xạ lớp A vào lớp C bằng khung dozer.Dozer ánh xạ các lớp bên trong

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 tập tin bản đồ:

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

Khi tôi cố gắng để ánh xạ các lớp này tôi đã theo ngoại lệ:

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) 

Nó vỉa rằng dozer là không có khả năng để xử lý tình trạng này và cách sử dụng lớp B là tên gói. Vấn đề này có thể được giải quyết bằng cách sử dụng bộ chuyển đổi tùy chỉnh. Tôi chỉ muốn biết là có bất kỳ thủ thuật nào có thể được sử dụng để chuyển đổi các lớp này chỉ bằng cách sử dụng cấu hình XML không?

+0

trong StackOverflow thông lệ là câu trả lời giúp bạn nhiều nhất. Ngoài ra nó cũng là phong tục để chấp nhận câu trả lời mà toàn diện hơn giúp giải quyết vấn đề của bạn. Bạn upvote một câu trả lời bằng cách sử dụng mũi tên phía trên bên trái của câu trả lời (số phiếu bầu sẽ tăng 1). Bạn chấp nhận câu trả lời bằng cách nhấp vào dấu kiểm bên dưới câu trả lời để nó chuyển sang màu xanh lục. –

Trả lời

22

Hãy thử sử dụng test.B$C như trong ví dụ sau:

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

Cũng lưu ý rằng tôi đã thay đổi lĩnh vực thứ hai từ fielda1 để fielda2, nó dường như là một lỗi đánh máy trong ví dụ của bạn.

Lưu ý: Bởi vì bạn thiết lập map-id="test" bạn phải bao gồm mapId khi bạn gọi đồ, như trong:

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

Tôi đã thử nghiệm và điều này đang làm việc một cách chính xác:

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

} 

này kết quả đầu ra trong giao diện điều khiển:

... 
fielda1Value 
fielda1Value 
+0

Nó hoạt động, hoàn hảo: D. Cảm ơn nhiều. –

+0

@ dino.keco rất vui được trợ giúp. vui lòng upvote và chấp nhận câu trả lời theo quy ước của StackOverflow. Xem nhận xét của tôi trong câu hỏi của bạn ở trên. –

Các vấn đề liên quan