java - 如何在 Spring Boot 中正确显示 DTO
问题描述
我的 Spring Boot 应用程序中有两个实体。我正在使用 dto 并最终显示我的 dto。但是我从我的 getRequest 中得到了错误的输出。我的第一个实体是 MeetingSetting,它可以有多个 MeetingTimes,在 MeetingTime 内我有 meetingName 作为外键。我想像这样显示会议时间:
{
"id": 1,
"date": "2021-06-31",
"startTime": "15:30",
"endTime": "16:30",
"meetingName": "Test"
}
但我得到的是这个:
{
"id": 1,
"date": "2021-06-31",
"startTime": "15:30",
"endTime": "16:30",
"meetingName": {
"id": 1,
"meetingName": "Tewasddweewrst2",
"meetingUrl": null,
"meetingPw": ""
}
}
有人可以看看我的代码并告诉我我做错了什么吗?
会议设置实体::
@Entity
@Table(name = "meeting_settings")
@Setter
@Getter
public class MeetingsSetting implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "meeting_name", unique = true)
private String meetingName;
@Column(name = "meeting_url")
private String meetingUrl;
@Column(name = "meeting_pw")
private String meetingPw;
@OneToMany(mappedBy = "meetingName", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<MeetingTime> meetingTime = new HashSet<>();
}
会议设置DTO:
@Getter
@Setter
public class MeetingSettingDTO {
private Long id;
@NotNull
private String meetingName;
@NotNull
private String meetingUrl;
@NotNull
private String meetingPw;
@JsonIgnore
private Set<MeetingTime> meetingTime;
}
会议时间实体:
@Entity
@Table(name = "meeting_times")
@Getter
@Setter
public class MeetingTime implements Serializable {
@JsonIgnore
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "meeting_date")
private String date;
@Column(name = "start_time")
private String startTime;
@Column(name = "end_time")
private String endTime;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "meeting_name" , referencedColumnName = "meeting_name")
private MeetingsSetting meetingName;
}
会议时间DTO:
@Getter
@Setter
public class MeetingTimeDTO {
private Long id;
@NotNull
private String date;
@NotNull
private String startTime;
@NotNull
private String endTime;
private MeetingSettingDTO meetingName;
}
在我的服务中,我首先从存储库中获取 MeetingTime 作为实体,然后将其转换为 DTO 并将其返回给我的控制器:
@Service
public class MeetingTimeService {
ModelMapper modelMapper = new ModelMapper();
@Autowired
MeetingTimeRepository meetingTimeRepository;
public List<MeetingTimeDTO> findAllMeetingTimes(){
List<MeetingTime> meetingTimeList = meetingTimeRepository.findAll();
return meetingTimeList.stream()
.map(this::convertToDto)
.collect(Collectors.toList());
}
private MeetingTimeDTO convertToDto(MeetingTime meetingTime) {
MeetingTimeDTO meetingTimeDTO = modelMapper.map(meetingTime, MeetingTimeDTO.class);
return meetingTimeDTO;
}
}
控制器:
@GetMapping(value = "/" )
public List<MeetingTimeDTO> getAllTimes() {
return meetingTimeService.findAllMeetingTimes();
}
解决方案
在会议时间DTO:
private MeetingSettingDTO meetingName;
类型需要更改为:
private string meetingName;
我没有使用过 ModelMapper,因此无法帮助您从相关对象映射特定字段,但这里的答案似乎提供了所需的信息。
推荐阅读
- php - 在成功的数据库连接期间未将数据发送到表
- python - 需要减去和删除前导零
- android - 如何使用 Room 将嵌套数据传递给 ViewModel 层?
- php - 如何显示所有 mysql 表及其在同一页面中显示的数据,如 phpmyadmin
- visual-studio - 按多列分组,然后对结果进行排序
- arrays - 如何在 CosmosDB 中为具有嵌套/多个数组的 JSON 文档编写 SQL 查询
- angular - 基于打字稿中的值的角度预选下拉项
- python - 为什么要创建两个窗口?
- java - 通过多个参数将字符串拆分为单词,例如空格和“-”
- firebase - 如何通过firebase(ios)使用flutter进行实时聊天