簡體   English   中英

推土機深度映射字段為String

[英]Dozer deep mapping field as String

我的對象太復雜了。

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

我寫了一個自定義的二傳手,而不是試圖弄清楚如何在Dozer中將所有這些列表合並為一個(我不確定它是否能做到)。

<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對象而不更改它。

我發現這樣做的唯一方法是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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM