2

假设我有以下课程:

class A1 {
  List<B1> bList;
}

class B1 {
  Long id;
}

---

class A2 {
  List<Long> bList;
}

我想用 Dozer 将 A1 类映射到 A2,其中 A1.bList 包含 B1 对象,而 A2.bList 仅包含 B1 对象的 ID。

映射会是什么样子?

谢谢你。

4

3 回答 3

0

我认为您可以通过覆盖B1中的toString()方法来做到这一点,它会起作用。

这是示例代码:

@Override
public String toString() {
return new String(this.id);
}

并在您的映射中进行以下更改:

<field>
 <a>bList</a>
 <b>bList</b>
 <a-hint>B</a-hint>
 <b-hint>java.lang.Long<b-hint>
</field>  

因此,当 dozer 尝试绑定 B1 时,它会将其 id 作为 String 返回,然后 dozer 将在 String 和 Long 之间执行自动转换。

于 2012-05-25T15:23:06.517 回答
0

您可以使用推土机自定义转换器。推土机客户转换器

一个例子:(可能的错误,没有编译或测试它)

<mapping>
  <class-a>A1</class-a>
  <class-b>A2</class-b>    
  <field custom-converter="converters.YourCustomConverter">
    <a>bList</a>
    <b>bList</b>
  </field>
</mapping>

自定义转换器:

public class YourCustomConverter implements CustomConverter {

    public Object convert(Object destination, Object source, Class destClass, Class sourceClass) {
        if (source == null) {
            return null;
        }
        if (source instanceof List<?>) {
            List<?> list = ((List<?>) source);
            if (list.isEmpty()) {
                return null;
            }
            if (list.get(0) instanceof B1) {
                List<Long> longList = new ArrayList<Long>();
                for (B1 b1 : list) {
                    longList.add(b1.getId());
                }
                return longList;
            } else (list.get(0) instanceof Long) {
                // do the inverse of the above
            } else {
                throw new MappingException("Wrong type ...");
            }
        } else {
            throw new MappingException("Converter YourCustomConverter used incorrectly. Arguments passed in were:"
                    + destination + " and " + source);
        }
    } 
}
于 2012-02-23T07:21:09.337 回答
0

Long我认为您可以尝试为to设置映射B1。如果我没记错的话,这只适用于一种方式,我不记得是哪种方式。对不起,希望这会有所帮助。

于 2011-04-13T16:14:41.933 回答