簡體   English   中英

Dozer 映射內部類

[英]Dozer mapping inner classes

我需要使用推土機框架將 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 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>

當我嘗試映射這些類時,出現以下異常:

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)

看來推土機無法處理這種情況,並使用 B 類作為包名。 可以使用自定義轉換器解決此問題。 我只是想知道是否有任何技巧可用於僅使用 XML 配置來轉換這些類?

嘗試在以下示例中使用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>

另請注意,我將第二個字段從fielda1fielda2 ,這在您的示例中似乎是一個錯字。

注意:因為您設置了map-id="test" ,所以在調用 map 時必須包含mapId ,例如:

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

我測試過,這是正常工作的:

一個.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;
        }
    }
}

映射文件

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

主程序

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

}

這在控制台中輸出:

...
fielda1Value
fielda1Value

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM