首页 > 解决方案 > 如何在 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();
    }

标签: javaspringspring-boot

解决方案


在会议时间DTO:

private MeetingSettingDTO meetingName;

类型需要更改为:

    private string meetingName;

我没有使用过 ModelMapper,因此无法帮助您从相关对象映射特定字段,但这里的答案似乎提供了所需的信息。


推荐阅读