ModelMapper – failed to convert org.hibernate.collection.internal.PersistentBag to java.util.ArrayList

huangapple go评论103阅读模式
英文:

ModelMapper - failed to convert org.hibernate.collection.internal.PersistentBag to java.util.ArrayList

问题

  1. // ModelMapper配置示例:
  2. compile group: 'org.modelmapper', name: 'modelmapper', version: '2.3.8'
  3. // 目前我有以下配置:
  4. modelMapper = new ModelMapper();
  5. modelMapper.getConfiguration()
  6. .setMatchingStrategy(MatchingStrategies.STANDARD)
  7. .setFieldMatchingEnabled(true)
  8. .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);
  9. // 我的实体类:
  10. @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true)
  11. private List<Phones> phones = new ArrayList<>();
  12. // 我的第二个实体类:
  13. @ManyToOne
  14. @JoinColumn(name = "employee_id")
  15. private Employee employee;
  16. // 我想要的DTO类:
  17. @Data
  18. @Builder
  19. @AllArgsConstructor
  20. @NoArgsConstructor(force = true)
  21. public class EmployeeDTO {
  22. @Singular
  23. private final List<PhoneDTO> phones;
  24. }
  25. // 我是这样进行映射的:
  26. EmployeeDTO.EmployeeDTOBuilder employeeDTOBuilder =
  27. ObjectMapperUtils.map(employee, EmployeeDTO.EmployeeDTOBuilder.class);
  28. // 我得到了以下错误:
  29. 1) 转换器 org.modelmapper.internal.converter.MergingCollectionConverter@969b4391 无法将 org.hibernate.collection.internal.PersistentBag 转换为 java.util.ArrayList
英文:

How should ModelMapper configuration looks like?

compile group: 'org.modelmapper', name: 'modelmapper', version: '2.3.8'

Currently I have:

  1. modelMapper = new ModelMapper();
  2. modelMapper.getConfiguration()
  3. .setMatchingStrategy(MatchingStrategies.STANDARD)
  4. .setFieldMatchingEnabled(true)
  5. .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);

My Entity has

  1. @OneToMany(mappedBy = &quot;employee&quot;, cascade = CascadeType.ALL, orphanRemoval = true)
  2. private List&lt;Phones&gt; phones = new ArrayList&lt;&gt;();

My second entity:

  1. @ManyToOne
  2. @JoinColumn(name = &quot;employee_id&quot;)
  3. private Employee employee;

My DTO which I want to have:

  1. @Data
  2. @Builder
  3. @AllArgsConstructor
  4. @NoArgsConstructor(force = true)
  5. public class EmployeeDTO {
  6. @Singular
  7. private final List&lt;PhoneDTO&gt; phones;
  8. }

I am mapping this in this way:

  1. EmployeeDTO.EmployeeDTOBuilder employeeDTOBuilder
  2. = ObjectMapperUtils.map(employee, EmployeeDTO.employeeDTOBuilder.class);

I'm getting:

  1. Converter org.modelmapper.internal.converter.MergingCollectionConverter@969b4391 failed to convert org.hibernate.collection.internal.PersistentBag to java.util.ArrayList.

答案1

得分: 1

深入查看堆栈跟踪:最后的映射问题通常是可操作性更强的内容。

也许 PhoneDTO 无法映射?如果是这样,您需要创建一个转换器,并告诉模型映射器,像这样:

  1. public class PhoneConverter extends AbstractConverter<PhoneEntity, PhoneDto>
  2. {
  3. private final StrictModelMapper strictModelMapper;
  4. @Override
  5. public PhoneDto convert(@NonNull final PhoneEntity source)
  6. {
  7. PhoneDto phoneDto = new PhoneDto();
  8. strictModelMapper.map(source, phoneDto);
  9. return phoneDto;
  10. }
  11. }

然后将其添加到 modelMapper 中。

英文:

Look a bit deeper in the stack trace: the last mapping problem is often something more actionable.

Maybe the PhoneDTO was not mappable ? If so, you need to create a converter and tell model mapper about it, like so:

  1. public class PhoneConverter extends AbstractConverter&lt;PhoneEntity, PhoneDto&gt;
  2. {
  3. private final StrictModelMapper strictModelMapper;
  4. @Override
  5. public PhoneDto convert(@NonNull final PhoneEntity source)
  6. {
  7. PhoneDto phoneDto = new PhoneDto();
  8. strictModelMapper.map(source, phoneDto);
  9. return phoneDto;
  10. }
  11. }

and add it to the modelMapper.

huangapple
  • 本文由 发表于 2020年9月3日 14:42:43
  • 转载请务必保留本文链接:https://go.coder-hub.com/63718182.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定