Глубокое отображение поля Dozer как String - PullRequest
0 голосов
/ 01 октября 2018

У меня есть объект, который слишком сложен.

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, но вместо этого он считывает поле questionAnswerGroup объекта Survey, а затем просматривает каждый элемент questionAnswerSets и заменяет их строковой версией.,Точка останова в методе toString в QuestionAnswerSet показывает, что Dozer вызывает это как часть своего процесса.

Я поставлен в тупик, пытаясь заставить Dozer просто принять объект Survey, не меняя его.

1 Ответ

0 голосов
/ 26 октября 2018

Единственный способ сделать это - установить 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>
...