【问题标题】:How to mapp an array to a complex type using Dozer如何使用 Dozer 将数组映射到复杂类型
【发布时间】:2012-04-04 17:30:16
【问题描述】:

我正在使用 Dozer 映射一些 bean,但我有一个我无法弄清楚的映射。

这是我的课程:

class A{
    private ComplexeType type;
    //Constructors & getters    
}

class B{
    private String[] type;
    //Constructors & getters 
}

class ComplexteType{
     private List<String> list;
    //Getter for the list, no constructor
}

如何将 A 类映射到 B 类?

我想用xml将A类的字段类型映射到B类的字段类型。

这里是xml文件:

<mapping>
        <class-a>A</class-a>
        <class-b>B</class-b>
        <field custom-converter="AToBCustomConverter">
            <a>type</a>
            <b>type</b>
        </field>
    </mapping>

这是来自我的 CustomConverter 的 sippet

if (source == null) {
            return null;
        }
        B dest = null;
        if (source instanceof java.lang.String) {
            // check to see if the object already exists
            if (destination == null) {
                dest = new A();
            } else {
                dest = (A) destination;
            }
            dest.getTypes().add((String) source);
            return dest;
        } else if (source instanceof B) {
            String[] sourceObj = ((B) destination)
                    .getType()
                    .toArray(
                            new String[((B) destination)
                                    .getType().size()]);
            return sourceObj;
        } else {
            throw new MappingException(
                    "Converter StatResultCustomConverter used incorrectly. Arguments passed in were:"
                            + destination + " and " + source);
        }
    }

【问题讨论】:

  • 请更好地描述您的问题。是否要将A.type 中的字段list 映射到B.type?到目前为止你有没有尝试过?您是使用 XML、注释还是以编程方式进行映射?
  • 您从 Dozer 收到什么样的输出/错误? can't get it done 它听起来不太具有描述性
  • 我编辑了我的问题以放置 xml 映射文件和我的 customConverter 类。
  • 这个回答了我的问题。 stackoverflow.com/questions/3018006/…

标签: java dozer


【解决方案1】:

我认为在这种情况下您的CustomConverter 是不必要的,请参阅here

在你的映射文件中试试这个:

<mapping>
  <class-a>A</class-a>
  <class-b>B</class-b>
  <field>
    <a>type.list</a>
    <b>type</b>
  </field>
</mapping>

并且推土机应该自动执行嵌套映射。

【讨论】:

  • 我之前做过,但我得到一个空列表。
  • 您的应用程序是否启用了日志记录?通常我发现 Dozer 映射问题与错误命名的 getter/setter 有关。尝试深入研究日志,看看为什么这些字段没有按预期映射。
  • 正如我在问题中所说,ComplexeType 只有一个用于 List 的 getter,没有 setter 也没有构造函数,这里是 getter 的注释:此访问器方法返回对 live 的引用列表,* 不是快照。因此,您对 * 返回的列表所做的任何修改都将出现在 JAXB 对象中。 * 这就是为什么 statResult 属性没有 set 方法的原因。 * *

    * 例如,要添加一个新项目,请执行以下操作: *

     * getStatResult().add(newItem); * 
  • 我刚刚在这里stackoverflow.com/questions/3018006/… 发现了一个类似的问题。谁能帮帮我?
【解决方案2】:

这是我用来解决问题的映射。

<mapping>
  <class-a>Q</class-a>
  <class-b>B</class-b>   
  <field>
    <a is-accessible="true">type<list</a>
    <b is-accessible="true">type</b>
  </field>
</mapping>

【讨论】:

    猜你喜欢
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    相关资源
    最近更新 更多