Spring Boot ModelMapper在尝试将EntityMap到DTO对象时返回NULL

rqcrx0a6  于 2023-11-17  发布在  Spring
关注(0)|答案(2)|浏览(209)

下面是我试图Map的对象的类:

  1. package com.agent.module.entities;
  2. import java.util.Set;
  3. import javax.persistence.Entity;
  4. import javax.persistence.FetchType;
  5. import javax.persistence.GeneratedValue;
  6. import javax.persistence.GenerationType;
  7. import javax.persistence.Id;
  8. import javax.persistence.ManyToMany;
  9. import javax.persistence.ManyToOne;
  10. import javax.persistence.OneToMany;
  11. import org.hibernate.annotations.Cascade;
  12. import org.hibernate.annotations.CascadeType;
  13. import lombok.Getter;
  14. import lombok.NoArgsConstructor;
  15. import lombok.Setter;
  16. import lombok.experimental.Accessors;
  17. @Entity
  18. @Getter @Setter @NoArgsConstructor
  19. @Accessors
  20. public class Accommodation {
  21. @Id
  22. @GeneratedValue(strategy = GenerationType.IDENTITY)
  23. private Long id;
  24. private String location;
  25. @ManyToOne(optional=false, fetch=FetchType.EAGER)
  26. private AccommodationType type;
  27. private String description;
  28. private String name;
  29. @OneToMany(orphanRemoval=true, fetch=FetchType.EAGER)
  30. @Cascade(CascadeType.ALL)
  31. private Set<Document> images;
  32. private Integer capacity;
  33. @ManyToMany(fetch=FetchType.EAGER)
  34. private Set<AdditionalService> additionalServices;
  35. @OneToMany(orphanRemoval=true, fetch=FetchType.EAGER)
  36. @Cascade(CascadeType.ALL)
  37. private Set<PricePlan> pricePlan;
  38. @ManyToOne(optional=false, fetch=FetchType.LAZY)
  39. private Agent agent;
  40. @OneToMany(orphanRemoval=true, mappedBy="accommodation", fetch=FetchType.EAGER)
  41. @Cascade(CascadeType.ALL)
  42. private Set<Restriction> restrictions;
  43. @ManyToOne(fetch=FetchType.EAGER)
  44. private Category category;
  45. @Override
  46. public String toString() {
  47. return "Name: "+name+"\n"+"Agent PIB: "+agent.toString()+"\n";
  48. }
  49. }

字符串
下面是我的DTO对象:

  1. package com.agent.module.dto;
  2. import java.util.List;
  3. import javax.xml.bind.annotation.XmlRootElement;
  4. import lombok.Getter;
  5. import lombok.NoArgsConstructor;
  6. import lombok.Setter;
  7. @Getter @Setter @NoArgsConstructor
  8. @XmlRootElement
  9. public class AccommodationView {
  10. private Long id;
  11. private String location;
  12. private String typeName;
  13. private String description;
  14. private String name;
  15. private List<String> imagesPath;
  16. private Integer capacity;
  17. private List<String> additionalServicesName;
  18. private List<PricePlanView> pricePlan;
  19. private String agentUsername;
  20. private List<RestrictionView> restrictions;
  21. private String categoryName;
  22. @Override
  23. public String toString() {
  24. return "ID: "+id+"\n"+"Type: "+typeName+"\n"+"Description: "+description+"\n"+"Category: "+categoryName+"\n"+"Name: "+name+"\n";
  25. }
  26. }


当我打开Postman并尝试从MySQL数据库中获取所有Accommodation对象时,我实际上想获取DTO对象,为了做到这一点,我使用了ModelMapper。但由于某种原因,每次我尝试将AccommodationMap到AccommodationView时,我都会得到返回。下面是我尝试执行Map的类:

  1. @RestController
  2. @RequestMapping(value = "/accommodation")
  3. public class AccommodationController {
  4. @Autowired
  5. AccommodationRepo accommodationRepo;
  6. @Autowired
  7. ModelMapper mapper;
  8. @RequestMapping(value="/all",
  9. method = RequestMethod.GET,
  10. produces = MediaType.APPLICATION_JSON_VALUE)
  11. @ResponseBody
  12. ResponseEntity<List<AccommodationView>> getAll(){
  13. List<Accommodation> accommodations = accommodationRepo.findAll();
  14. List<AccommodationView> accommodationViewList= new ArrayList<AccommodationView>();
  15. for(Accommodation accommodation : accommodations) {
  16. System.out.println(accommodation);
  17. System.out.println(convertToDto(accommodation));
  18. accommodationViewList.add(convertToDto(accommodation));
  19. }
  20. return new ResponseEntity<List<AccommodationView>>(accommodationViewList, HttpStatus.OK);
  21. }
  22. private AccommodationView convertToDto(Accommodation accommodation) {
  23. return mapper.map(accommodation, AccommodationView.class);
  24. }
  25. private Accommodation convertToEntity(AccommodationView accommodationView) {
  26. return mapper.map(accommodationView, Accommodation.class);
  27. }
  28. }


下面是我在调用该方法时得到的输出:

  1. Name: Test
  2. Agent PIB: 2308995710368
  3. ID: null
  4. Type: null
  5. Description: null
  6. Category: null
  7. Name: null


输出的第一部分来自Accommodation对象,输出的第二部分来自AccommodationView对象。如果有人知道发生了什么,我将非常感谢帮助。

kmb7vmvb

kmb7vmvb1#

你必须为目标类生成公共setter函数,在你的例子中(Accommodation Entity)。否则Modelmapper不能访问你的类的私有字段来设置它们的值。

cigdeys3

cigdeys32#

我给你的问题提出两个解决办法。

解决方案1

在你的dto对象中,尝试添加@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)。或者为每个dto字段添加@JsonPrperty注解。这两种方法可以帮助Mapdto对象和json postman响应。

解决方案2

看起来你的问题是关于mapstruct或/和lombok的。我建议你检查生成的mapper impl mapstruct文件ModelMapperImpl是否看起来很好(你应该为每个实体字段提供一个与dto关联字段Map的指令,反之亦然)。
如果不是这种情况,请检查pom.xml或build.gradle文件中的lombok、mapstruct和lombok-mapstruct-binding deps是否配置良好(here an example for this implementation with maven)。此外,对于IDE,请检查lombok是否配置良好(by installing lombok plugins and enabling annotation processors

相关问题