2

我正在使用推土机将我的对象 A 映射到 B

Class A {
int indicatorA;
List<A> listA;
// get set methods...
}

Class B{
int indicatorB;
List<B> listB;
// get set methods...
}

我正在尝试将 A 映射到 B,并且我想将 parent indicatorA 值设置为 listB 示例中的所有子项:

A parentA = new A();    // with indicatorA = 10
A child1A = new A();    // indicatorA value has not set
A child2A = new A();    // indicatorA value has not set
parentA.getListA.add(child1A);
parentA.getListA.add(child2A);

映射后,我想像这样看到对象 B

B parentB // 指标 B = 10 和 parentB.listB 有 2 个对象 child1B 和 chld2B,指标 B 值设置为 10

如何编写自定义转换器或任何简单的方法来做到这一点?非常感谢任何帮助..谢谢

4

1 回答 1

0

是的,您将需要一个 CustomConverter 实现,因为无法通过直接映射在 List 的元素内设置值。

Dozer XML 需要一个简单的配置标签,引用 CustomConverter 类:

<?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">
  <configuration>
    <custom-converters>
        <converter type="somepackage.MyConverter" >
            <class-a>somepackage.A</class-a>
            <class-b>somepackage.B</class-b>
        </converter>
    </custom-converters>     
  </configuration>
</mappings>

这是 CustomConverter:

public class MyConverter implements CustomConverter {
    public Object convert(Object destination, Object source, Class destClass, Class sourceClass){
         if (source == null) {
              return null;
            }
            B dest = null;
            if (source instanceof A) {
                // check to see if the object already exists
                if (destination == null) {
                  dest = new B();
                } else {
                  dest = (B) destination;
                }

              //dest is your parentB instance

              //setting indicatorB value in parentB
                dest.setIndicatorB(((A) source).getIndicatorA()); 

              //creating child instances of B
                B child1B = new B();
                B child2B = new B();  

              //setting indicatorB values to the child instances as well
                child1B.setIndicatorB(((A) source).getIndicatorA());                
                child2B.setIndicatorB(((A) source).getIndicatorA()); 

              //adding child Bs to parentB list
                List<B> listOfBs = new ArrayList<B>(); 
                listOfBs.add(child1B);
                listOfBs.add(child2B);
                dest.setListB(listOfBs);
                return dest;
            }
            return null;        
    }
}

如果 childAs 的数量仅在运行时已知,您可以使用 CustomConverter 中的循环来创建相应数量的 childB。

于 2017-03-05T07:39:38.020 回答