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

推土机深度映射字段为字符串

申光临
2023-03-14

我有一个非常复杂的对象。

public class OrderItem {
    private Survey survey;
    ...
}

public class Survey {
    private QuestionAnswerGroup questionAnswerGroup;
    ...
}

public class QuestionAnswerGroup {
    private Map<String, List<QuestionAnswerSet>> questionAnswerSets;
    ...
}

我的目标是将问题答案集映射展平,以便将值中的所有列表合并为一个

public class OrderItemDTO {
    private List<OrderItemQuestionAnswer> survey;
    ...
}

我没有试图找出如何在Dozer中将所有这些列表合并到一个列表中,我甚至不确定它是否能够做到,而是编写了一个自定义setter。

<mapping wildcard="false">
    <class-a>OrderItem</class-a>
    <class-b>OrderItemDTO</class-b>
    <field>
        <a get-method="getSurvey" is-accessible="false">survey</a>
        <b set-method="makeFlatSurvey" get-method="makeDomainSurvey" is-accessible="false">survey</b>
    </field>
    ...
</mapping>

我假设这意味着Dozer只需读取第一个对象的调查并将其放入makeFlatSurvey,但它读取调查对象上的questionAnswerGroup字段,然后遍历QuestionAnswerSet中的每个项目,并将其替换为字符串版本。QuestionAnswerSet上的toString方法中有一个断点,表明Dozer正在调用它作为其进程的一部分。

我在这里遇到了一个方法,迫使推土机只接受调查对象而不改变它。

共有1个答案

施辉
2023-03-14

我发现要做到这一点的唯一方法是将“按引用复制”(copy by reference)设置为true。

您还没有发布OrderItem问答类,但我假设它如下所示:

public class OrderItemQuestionAnswer {
    private String question;
    private String answer;  
    // Getters/setters and toString omitted
}

我还假设OrderItemDTO。makeFlatSurvey如下所示:

public void makeFlatSurvey(Survey survey)
{
    for (List<QuestionAnswerSet> questionAnswerSets : survey.getQuestionAnswerGroup().getQuestionAnswerSets().values())
    {
        for (QuestionAnswerSet questionAnswerSet : questionAnswerSets)
        {
            OrderItemQuestionAnswer orderItemQuestionAnswer = new OrderItemQuestionAnswer();
            orderItemQuestionAnswer.setQuestion(questionAnswerSet.getQuestion());
            orderItemQuestionAnswer.setAnswer(questionAnswerSet.getAnswer());
            this.survey.add(orderItemQuestionAnswer);
        }
    }
}

修改映射中的字段元素并添加copy by reference=“true”将防止ClassCastException(我不知道为什么):

<mapping wildcard="false">
    <class-a>OrderItem</class-a>
    <class-b>OrderItemDTO</class-b>
    <field copy-by-reference="true">
        <a get-method="getSurvey" is-accessible="false">survey</a>
        <b set-method="makeFlatSurvey" get-method="makeDomainSurvey" is-accessible="false">survey</b>
    </field>
    ...
</mapping>
 类似资料:
  • 我在srcopobject中收集了StateTax和LocalTax。这需要映射到StateLocalTax的集合。在SrcObject中,如果我有三个SrcStateTax和两个SrcLocalTax,我想将它们映射到一个StateLocalTax集合,该集合将有四个元素。此集合的三个元素将包含stateTax信息和null destLocalTaxGroup,一个元素将包含destLocalT

  • 我有以下实体、DTO类和推土机映射文件。我正在尝试使用推土机映射将包含2个微弱字节数组的Hibernate实体复制到新的DTO。获取java.lang.IllegalArgumentException:数组元素类型不匹配。 有什么想法吗? 映射文件: 实体类: DTO等级: 例外情况:

  • 我有一个类,我们用一个映射字段将其称为a,它被转换为B类,用于数据库存储/检索,其中该字段映射到字符串。从A到B的映射非常有效。然而,当从B到A时,我得到了一个IllegalArgument异常,它表示无法将字符串转换为映射。让我困惑的是,Dozer的文档中说,这确实适用于以下情况: 数据类型转换由Dozer映射引擎自动执行。目前,Dozer支持以下类型的转换:(这些都是双向的) 然后它继续列出要

  • 我试图使用Dozer映射UUID字段,遇到了Dozer github上提到的一个问题: https://github.com/DozerMapper/dozer/issues/83 问题是-显然,Dozer依赖于UUID中不存在的默认无参数构造函数。因此,该链接显示了如何告知推土机执行参考复制。然而,使用该提示并没有帮助,我仍然会遇到以下异常: org.dozer.java.lang.java.u

  • 为什么推土机不能将数字类型的源类变量映射到相同类型的目标类变量? 正在获取以下异常: 在这里,源类和目标类都引用了相同的类类型,比如事务。两者都有Number字段,但在从源类映射到目标类时,它会引发这样的异常。 我不明白为什么同一数据类型会出现“参数不匹配”?

  • 我在Spring启动时使用推土机映射器。如果我将数据从实体映射到EntityDTO,那么dozer maper的工作就是将数据从实体类复制到EntityDTO,对于原语也是如此。但是假设我有这样一门课 和名称为EntityDTO的DTO 那么它不会将数据从entityChild映射到EntityChildTos,有人能帮我解决这个问题吗?