我的对象太复杂了。
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对象而不更改它。
答案 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>