Отображение внутренних классов Dozer

Мне нужно сопоставить класс A с классом C, используя структуру dozer.

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)

Похоже, dozer не справляется с этой ситуацией и использует класс B в качестве имени пакета. Эту проблему можно решить с помощью пользовательских конвертеров. Я просто хочу знать, есть ли какой-нибудь трюк, который можно использовать для преобразования этих классов, используя только конфигурацию XML?


person dino.keco    schedule 12.11.2010    source источник
comment
в StackOverflow принято голосовать за ответы, которые помогли вам больше всего. Кроме того, также принято принимать ответ, который более полно помог решить вашу проблему. Вы голосуете за ответ, используя верхнюю стрелку слева от ответа (количество голосов увеличится на 1). Вы принимаете ответ, щелкнув галочку под ответом, чтобы она стала сплошной зеленой.   -  person Jorge Ferreira    schedule 16.11.2010


Ответы (1)


Попробуйте использовать 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>

Также обратите внимание, что я изменил второе поле с fielda1 на fielda2, в вашем примере это оказалась опечатка.

Примечание. Поскольку вы устанавливаете map-id="test", вы должны включать mapId при вызове карты, например:

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

Я проверил, и это работает правильно:

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

}

Это выводит в консоли:

...
fielda1Value
fielda1Value
person Jorge Ferreira    schedule 12.11.2010
comment
@dino.keco рад помочь. пожалуйста, проголосуйте и примите ответ в соответствии с соглашениями StackOverflow. См. мой комментарий в вашем вопросе выше. - person Jorge Ferreira; 16.11.2010