[英]Dozer mapping inner classes
I need to map class A into class C using dozer framework.我需要使用推土机框架将 A 类映射到 C 类。
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 mapping file: XML映射文件:
<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>
When i try to map these classes i got following exception:当我尝试映射这些类时,出现以下异常:
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)
It seams that dozer is not capable to handle this situation and uses class B as a package name.看来推土机无法处理这种情况,并使用 B 类作为包名。 This issue can be resolved using custom converters.可以使用自定义转换器解决此问题。 I just want to know is there any trick that could be used to convert these classes using just XML configuration ?我只是想知道是否有任何技巧可用于仅使用 XML 配置来转换这些类?
Try using test.B$C
like in the following example:尝试在以下示例中使用test.B$C
:
<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>
Also note that I changed the second field from fielda1
to fielda2
, it appeared to be a typo in your example.另请注意,我将第二个字段从fielda1
为fielda2
,这在您的示例中似乎是一个错字。
Note: Because you set map-id="test"
you must include mapId
when you call map, like in:注意:因为您设置了map-id="test"
,所以在调用 map 时必须包含mapId
,例如:
B.C destObject = mapper.map(a, B.C.class, "test");
I tested and this is working correctly:我测试过,这是正常工作的:
A.java一个.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 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());
}
}
This outputs in the console:这在控制台中输出:
...
fielda1Value
fielda1Value
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.