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

尽管指定了具有相同名称和XML映射的字段,但Dozer Mapper不会映射

昌勇锐
2023-03-14
  1. ObjectWithList、ListWrapper和ObjectWithWrapper类如下:
//com.github.komidawi.ObjectWithList
public class ObjectWithList {
    private List<String> list;
    // ...
}

//com.github.komidawi.ListWrapper 
public class ListWrapper {
    private List<String> wrappedList;
    // ...
}

//com.github.komidawi.ObjectWithWrapper
public class ObjectWithWrapper {
    private ListWrapper list;
    // ...
}

MyCustomConverter类来包装/展开这些列表。

mapperConfiguration。xml配置文件

<!-- ... -->
<configuration>
    <stop-on-errors>true</stop-on-errors>
    <wildcard>true</wildcard>

    <custom-converters>
        <converter type="com.github.komidawi.MyCustomConverter">
            <class-a>com.github.komidawi.ListWrapper</class-a>
            <class-b>java.util.List</class-b>
        </converter>
    </custom-converters>
</converter>

<mapping>
        <class-a>com.github.komidawi.ObjectWithList</class-a>
        <class-b>com.github.komidawi.ObjectWithWrapper</class-b>
</mapping>
// ... creating objects
ObjectWithList objectWithList = mapper.map(objectWithWrapper, ObjectWithList.class);
objectWithList.getList(); // This is null

不幸的是,映射后,objectWithList的列表字段为null。我使用了调试器,在这种情况下,Dozer甚至没有输入MyCustomConverter。

令人惊讶的是,不同方向的映射效果很好:

ObjectWithWrapper objecthWithWrapper = mapper.map(objectWithList, ObjectWithWrapper.class);
objecthWithWrapper.getList(); // This is not null
  1. ObjectWithList和ObjectWithWrapper:list中的字段名都相同
  2. 我已经为xml文件中的Java列表和ListWrapper指定了自定义转换器
  3. 我在xml文件中指定了ObjectWithList和ObjectWithWrapper之间的映射
  4. 在这两种情况下,Dozer都说:“成功地从URL加载了自定义xml映射”
  5. 从ObjectWithList映射到ObjectWithWrapper时,效果很好

映射后,objectWithList具有null而不是实际列表。我发现它甚至没有进入MyCustomConverter

共有1个答案

洪胜涝
2023-03-14

集合是特殊的,类型擦除使其更具挑战性。如果您只希望wrappedList中的项目位于生成的ObjectWithList实例的列表中,那么这可以在不使用转换器的情况下完成。Dozer将处理嵌套属性映射,因此您可以通过指示Dozer将列表映射到彼此的方式来描述映射。

new BeanMappingBuilder() {
    configure() {
        mapping(ObjectWithList.class, ObjectWithWrapper.class,
            .fields("list.wrappedList", "list")
    }
}

或在XML中

<mapping>
        <class-a>com.github.komidawi.ObjectWithList</class-a>
        <class-b>com.github.komidawi.ObjectWithWrapper</class-b>
        <field>
            <a>list.wrappedList</a>
            <b>list</b>
        </field>
</mapping>
 类似资料:
  • 我正在使用访问数据的Spring Boot项目中工作,并且我在使用

  • 问题内容: Jackson json注释中以下jax-b注释的等效方式是什么? 我需要生成json而不是xml,并且需要了解在jax-b中等效表示的常规jackson批注。 重命名字段。 使用getter代替字段。 如果json / xml元素名称是Java保留字(例如“ ”,“ ”,“ ”等),则这些功能尤其重要。 因此我们必须将POJO字段分别命名为“ new ”,“ _ public ”,“

  • 我目前正在使用Jackson的XmlMapper和ObjectMapper。我想将该字符串映射到一个POJO(我想我正确地使用了该术语),该POJO有一个与JSON字符串字段同名的私有字段。XML字符串对于同一字段/属性有不同的名称,我想使用JSON字段名称。 我还想从本质上“忽略”该字段(同时保留它),并将其存储为类似于JsonNode的内容,因为该字段的值可以是一些复杂的嵌套值,而没有已知的形

  • 我会从我想达到的目标开始 意图 该软件在for循环中解析XML数据。处理数据的 for 循环将持续到 50(因为我得到了 50 个不同的结果)。我最初所做的是,-方法解析整个XML数据并将其保存到TextViews中并显示它。但现在我想添加一个启动画面,只要数据加载就会显示。 XML文件像任何其他普通XML文件一样构建,因此当我通过for循环时,键总是相同的,但值不同。 方法 我已经做的是创建一个

  • 问题内容: 我有一个无法控制其生成方式的XML。我想通过将其分解为我手工编写的类来创建一个对象。 其结构的一个片段如下所示: 我该如何处理这种情况?当然,元素数是可变的。 问题答案: 如果使用以下对象模型,则每个未映射的key_#元素都将保留为org.w3c.dom.Element的实例: 如果任何元素对应于使用@XmlRootElement批注映射的类,则可以使用@XmlAnyElement(l

  • 在我的搜索引擎中,用户可以选择搜索大小写敏感或不敏感。如果他们选择这样做,查询将搜索使用自定义区分大小写分析器的字段。这是我的设置: 获取/candidates/_settings 因此,我从这个答案中创建了一个名为的自定义分析器。我试图定义我的,如下所示: 把/candidates/_mapping/candidate 因此,在查询区分大小写的匹配时,我可以执行以下操作: 我甚至没有进入最后一步