Java 集合映射

Java 集合映射,java,collections,dozer,Java,Collections,Dozer,假设我有以下几个类: class A1 { List<B1> bList; } class B1 { Long id; } --- class A2 { List<Long> bList; } A1级{ 列表列表; } B1类{ 长id; } --- A2类{ 列表列表; } 我想用Dozer将类A1映射到A2,其中A1.bList包含B1对象,A2.bList仅包含B1对象的ID 映射是什么样子的 谢谢。我想您可以尝试设置Long到B1的映射。如果

假设我有以下几个类:

class A1 {
  List<B1> bList;
}

class B1 {
  Long id;
}

---

class A2 {
  List<Long> bList;
}
A1级{
列表列表;
}
B1类{
长id;
}
---
A2类{
列表列表;
}
我想用Dozer将类A1映射到A2,其中A1.bList包含B1对象,A2.bList仅包含B1对象的ID

映射是什么样子的


谢谢。

我想您可以尝试设置
Long
B1
的映射。如果我没记错的话,这只是单向的,我不记得是哪一种方式。抱歉,希望这有帮助。

我想您可以尝试设置
Long
B1
的映射。如果我没记错的话,这只是单向的,我不记得是哪一种方式。抱歉,希望这有帮助。

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

示例:(可能的错误,未编译或测试)


A1
A2
布利斯特
布利斯特
自定义转换器:

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);
        }
    } 
}
公共类YourCustomConverter实现CustomConverter{
公共对象转换(对象目标、对象源、类destClass、类sourceClass){
if(source==null){
返回null;
}
if(列表的源实例){
列表=((列表)源);
if(list.isEmpty()){
返回null;
}
if(列表获取B1的(0)实例){
List longList=new ArrayList();
对于(B1:列表){
longList.add(b1.getId());
}
返回长列表;
}else(list.get(0)instanceof Long){
//做与上述相反的事情
}否则{
抛出新的MappingException(“错误类型…”);
}
}否则{
抛出新的MappingException(“Converter YourCustomConverter使用不正确。传入的参数为:”
+目的地+”和“+来源);
}
} 
}

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

示例:(可能的错误,未编译或测试)


A1
A2
布利斯特
布利斯特
自定义转换器:

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);
        }
    } 
}
公共类YourCustomConverter实现CustomConverter{
公共对象转换(对象目标、对象源、类destClass、类sourceClass){
if(source==null){
返回null;
}
if(列表的源实例){
列表=((列表)源);
if(list.isEmpty()){
返回null;
}
if(列表获取B1的(0)实例){
List longList=new ArrayList();
对于(B1:列表){
longList.add(b1.getId());
}
返回长列表;
}else(list.get(0)instanceof Long){
//做与上述相反的事情
}否则{
抛出新的MappingException(“错误类型…”);
}
}否则{
抛出新的MappingException(“Converter YourCustomConverter使用不正确。传入的参数为:”
+目的地+”和“+来源);
}
} 
}

我认为您可以通过重写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>  

布利斯特
布利斯特
B
java.lang.Long

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

我认为您可以通过重写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>  

布利斯特
布利斯特
B
java.lang.Long

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

您能解释如何设置Long和B1之间的映射吗?您能解释如何设置Long和B1之间的映射吗?