java - 尝试将实体映射到 DTO 对象时,ModelMapper 返回 NULL
问题描述
这是我要映射的对象的类:
package com.agent.module.entities;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
@Entity
@Getter @Setter @NoArgsConstructor
@Accessors
public class Accommodation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String location;
@ManyToOne(optional=false, fetch=FetchType.EAGER)
private AccommodationType type;
private String description;
private String name;
@OneToMany(orphanRemoval=true, fetch=FetchType.EAGER)
@Cascade(CascadeType.ALL)
private Set<Document> images;
private Integer capacity;
@ManyToMany(fetch=FetchType.EAGER)
private Set<AdditionalService> additionalServices;
@OneToMany(orphanRemoval=true, fetch=FetchType.EAGER)
@Cascade(CascadeType.ALL)
private Set<PricePlan> pricePlan;
@ManyToOne(optional=false, fetch=FetchType.LAZY)
private Agent agent;
@OneToMany(orphanRemoval=true, mappedBy="accommodation", fetch=FetchType.EAGER)
@Cascade(CascadeType.ALL)
private Set<Restriction> restrictions;
@ManyToOne(fetch=FetchType.EAGER)
private Category category;
@Override
public String toString() {
return "Name: "+name+"\n"+"Agent PIB: "+agent.toString()+"\n";
}
}
这是我的 DTO 对象:
package com.agent.module.dto;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter @Setter @NoArgsConstructor
@XmlRootElement
public class AccommodationView {
private Long id;
private String location;
private String typeName;
private String description;
private String name;
private List<String> imagesPath;
private Integer capacity;
private List<String> additionalServicesName;
private List<PricePlanView> pricePlan;
private String agentUsername;
private List<RestrictionView> restrictions;
private String categoryName;
@Override
public String toString() {
return "ID: "+id+"\n"+"Type: "+typeName+"\n"+"Description: "+description+"\n"+"Category: "+categoryName+"\n"+"Name: "+name+"\n";
}
}
当我打开我的 Postman 并尝试从MySQLAccommodation
数据库中获取所有对象时,我实际上想要获取 DTO 对象,为了做到这一点,我正在使用. 但由于某种原因,每次我尝试映射到 时,我都会得到 Null 作为回报。这是我尝试执行映射的类:ModelMapper
Accommodation
AccommodationView
@RestController
@RequestMapping(value = "/accommodation")
public class AccommodationController {
@Autowired
AccommodationRepo accommodationRepo;
@Autowired
ModelMapper mapper;
@RequestMapping(value="/all",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
ResponseEntity<List<AccommodationView>> getAll(){
List<Accommodation> accommodations = accommodationRepo.findAll();
List<AccommodationView> accommodationViewList= new ArrayList<AccommodationView>();
for(Accommodation accommodation : accommodations) {
System.out.println(accommodation);
System.out.println(convertToDto(accommodation));
accommodationViewList.add(convertToDto(accommodation));
}
return new ResponseEntity<List<AccommodationView>>(accommodationViewList, HttpStatus.OK);
}
private AccommodationView convertToDto(Accommodation accommodation) {
return mapper.map(accommodation, AccommodationView.class);
}
private Accommodation convertToEntity(AccommodationView accommodationView) {
return mapper.map(accommodationView, Accommodation.class);
}
}
这是我点击该方法时得到的输出:
Name: Test
Agent PIB: 2308995710368
ID: null
Type: null
Description: null
Category: null
Name: null
输出的第一部分来自Accommodation
对象,输出的第二部分来自AccommodationView
对象。如果有人知道发生了什么,我将非常感谢您的帮助。
解决方案
在您的情况下(住宿实体),您必须为目标类生成公共设置器函数。否则 Modelmapper 无法访问您的类的私有字段来设置它们的值。
推荐阅读
- xcode - Xcode SKS 场景编辑器中缺少命名颜色资源
- flutter - 无法将 Pdf 与 ConvertApi Rest api Flutter 合并
- tkinter - 没有任何方法可以为当前 Button() 类中的按钮添加边框半径。在 pythonTkinter 中是否有任何属性可以添加边框半径?
- javascript - 尝试从 jquery $(document).ready 调用外部 js 中定义的函数
- webstorm - CSS 声明属性的代码完成
- sql - 没有FK时如何找到维度表和事实表之间的关系?
- spring - 调用具有多个 @RequestParam 自定义对象的 GET api
- java - com.google.android.geo.API_KEY API 级别 26 无法识别
- powershell - 如何在 Powershell 配置文件中设置控制台输出的默认颜色
- jmeter - 无法访问 UDV 变量