推土机深度映射字段为String

时间:2018-10-01 16:30:11

标签: java dozer

我的对象太复杂了。

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

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

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

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

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

我写了一个自定义的二传手,而不是试图弄清楚如何在推土机中将所有这些列表合并为一个,我不确定它是否能做到。

<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会简单地从第一个对象中读取Survey并将其放入makeFlatSurvey中,但是它将读取Survey对象上的questionAnswerGroup字段,然后遍历questionAnswerSets中的每个项目并替换他们自己的字符串版本。 QuestionAnswerSet的toString方法中的断点表明Dozer正在将其作为过程的一部分进行调用。

在这里我被迫强迫Dozer仅接受Survey对象而不更改它。

1 个答案:

答案 0 :(得分:0)

我发现这样做的唯一方法是将copy-by-reference设置为true。

您尚未发布OrderItemQuestionAnswer课程,但我认为它如下:

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);
        }
    }
}

修改映射中的field元素并添加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>