当前位置: 首页 > 知识库问答 >
问题:

Dozer,Java:如何从List转换为2D数组?

彭雨华
2023-03-14

我有一个列表,我试图映射到一个二维数组[][]使用推土机和自定义转换器。

public class Field {
    List<String> items;

    public void add(String s) {
        items.add(s);
    }
}

public class ClassA {
    int anotherVariable;

    List<Field> fields;

    public void add(Field f) {
        fields.add(f);
    }
}

public class ClassB {
    int anotherVariable;

    String[][] itemValues;
}

@Test
public void convertListTo2DArray() {
    Field field1 = new Field();
    field1.add("m"); field1.add("n");

    Field field2 = new Field();
    field2.add("o"); field2.add("p");

    ClassA classA = new ClassA();
    classA.add(field1);  
    classA.add(field2);

    classA.setAnotherVariable(99);

    List<Converter> converters = new ArrayList<Converter>();
    converters.add(new ListToArrayConverter());

    ClassB classB = new DozerBeanMapper().setCustomConverters(converters).map(classA, ClassB.class);  

    /**
     * Result:
     * classB -> anotherVariable = 99
     *
     * classB -> itemValues[][] =
     * ["m", "n"]
     * ["o", "p"]
     */  
}

转换器只能用于在List之间进行转换

我查看了以下问题的答案,但如何在自定义转换器中处理数组而不是集合/列表?从HashSet到Arraylist的Dozer映射

任何建议都将不胜感激谢谢


共有1个答案

海典
2023-03-14

我的java有点生疏了,请耐心等待。

如果您希望转换器仅用于将List转换为String数组而不是其他任何内容,您可以限制它的方法之一是仅为xml中的这两个字段指定自定义转换器:

<mapping>
<class-a>beans6.ClassA</class-a>
<class-b>beans6.ClassB</class-b>
<field custom-converter="converter.ConvertListToArray">
    <a>fields</a>
    <b>itemValues</b>
</field>
</mapping>

接下来,需要将字段类中的属性和ClassA类中的字段属性初始化为ArrayList,以防止它们引发NullPointerException。

List<String> items = new ArrayList<String>();
List<Field> fields = new ArrayList<Field>();

最后,这里是CustomConverter,假设添加到字段的元素数量始终不变:

public class ConvertListToArray implements CustomConverter{
    public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue, 
    Class<?> destinationClass, Class<?> sourceClass) {
        if(sourceFieldValue==null)
            return null;

        if(sourceFieldValue instanceof List && ((List<?>) sourceFieldValue).size()>0){
            List<Field> listOfFields = (List<Field>)sourceFieldValue;

            String[][] destinationValue = new String[2][2];
            for (int i = 0; i<2;i++){
                 Field f = listOfFields.get(i);
                 for (int j = 0;j<f.getItems().size();j++){
                     destinationValue[i][j] = f.getItems().get(j);
                 }
             }
             return destinationValue;

         }
        return null;
    }
}
 类似资料:
  • 我有我想分批处理的编号列表。

  • 问题内容: 我希望此代码显示: 问题答案: 在将导致的一个单列表。 如果更改为,它将按预期工作。不知道这是否对您有帮助。

  • 我有一个方法createCompliance响应(),它返回BOLConplationObject对象,在此之前,我将其更改为BOLConplationMono,因为我必须在其中调用另一个反应性服务。但是在这样做之后,我调用该服务的当前服务在第6行和第7行出现错误。 我为其更改了退货类型的另一项服务是

  • 到目前为止,我在这里找到了一些答案,但每次都会出现无法从对象转换为字符串的错误,等等。例如,我现在使用了这个想法: 我有以下与我的数据库映射的对象列表:

  • 这是我从获取请求中获得的响应,如何将此响应转换为Java列表,以便我可以在列表上执行Stream(.)过滤器。

  • 我在MongoDB中使用Java驱动程序3.0,以便通过Web服务发送JSON。 当我想将文档对象(org.bson.文档)转换为JSON时,我使用,当我想将JSON转换为文档对象时,我使用。 但是,当我处理文档列表时(如JSON中所示: