簡體   English   中英

如何在春季啟動時在oneToMany中修復HttpMessageNotWritableException

[英]How to fix HttpMessageNotWritableException in oneToMany in Spring boot

我使用spring boot和使用hibernate在Entity之間創建一些關系。 但是當我獲取數據時,會拋出錯誤:

org.springframework.http.converter.HttpMessageNotWritableException.

下面是我的代碼:

實體 :

Singer.class:

@Entity
public class Singer implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @Column(name = "FIRST_NAME")
    private String firstName;
    @Column(name = "LAST_NAME")
    private String lastName;
    @Column(name = "BIRTH_DAY")
    private Date birthDay;
//    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id", scope=ServerRequest.class)
    @JsonIgnore
    @OneToMany(mappedBy = "singer", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Album> albums = new ArrayList<>();

//    @JsonIgnore
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "singer_instrument", joinColumns = @JoinColumn(name = "SINGER_ID"), inverseJoinColumns = @JoinColumn(name = "INSTRUMENT_ID"))
    private Set<Instrument> instruments = new HashSet<>();



    public Singer() {
    }

    public Singer(String firstName, String lastName, Date birthDay, List<Album> albums, Set<Instrument> instruments) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.birthDay = birthDay;
        this.albums = albums;
        this.instruments = instruments;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Date getBirthDay() {
        return birthDay;
    }

    public void setBirthDay(Date birthDay) {
        this.birthDay = birthDay;
    }

    public List<Album> getAlbums() {
        return albums;
    }

    public void setAlbums(List<Album> albums) {
        this.albums = albums;
    }

    public Set<Instrument> getInstruments() {
        return instruments;
    }

    public void setInstruments(Set<Instrument> instruments) {
        this.instruments = instruments;
    }

    public boolean addAbum(Album album) {
        album.setSinger(this);
        return getAlbums().add(album);
    }

    public boolean addInstrument(Instrument instrument) {
        return instruments.add(instrument);
    }

    @Override
    public String toString() {
        return "Singer - Id: " + id + ", First name: " + firstName
                + ", Last name: " + lastName + ", Birthday: " + birthDay;
    }

}

AlbumClass:

   @Entity
public class Album implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @Column(name = "TITLE")
    private String title;
    @Column(name = "RELEASE_DATE")
    private Date releaseDate;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "singer_id")
    private Singer singer;

    public Album() {
    }

    public Album(String title, Date releaseDate, Singer singer) {
        this.title = title;
        this.releaseDate = releaseDate;
        this.singer = singer;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Date getReleaseDate() {
        return releaseDate;
    }

    public void setReleaseDate(Date releaseDate) {
        this.releaseDate = releaseDate;
    }

    public Singer getSinger() {
        return singer;
    }

    public void setSinger(Singer singer) {
        this.singer = singer;
    }

    @Override
    public String toString() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return String.format("Album - id: %d, Singer id: %d, Title: %s, Release Date: %s",
                id, singer.getId(), title, sdf.format(releaseDate));
    }

}

儀器 :

@Entity
public class Instrument implements Serializable {

    @Id
    @Column(name = "INSTRUMENT_ID")
    private String instrumentId;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "singer_instrument", joinColumns = @JoinColumn(name = "INSTRUMENT_ID"), inverseJoinColumns = @JoinColumn(name = "SINGER_ID"))
    private Set<Singer> singers = new HashSet<>();

    public Instrument() {
    }

    public Instrument(String instrumentId) {
        this.instrumentId = instrumentId;
    }

    public String getInstrumentId() {
        return instrumentId;
    }

    public void setInstrumentId(String instrumentId) {
        this.instrumentId = instrumentId;
    }

    public Set<Singer> getSingers() {
        return singers;
    }

    public void setSingers(Set<Singer> singers) {
        this.singers = singers;
    }

    @Override
    public String toString() {
        return "Instrument :" + getInstrumentId();
    }


  }

SingerController:

@RestController
@RequestMapping(path = "/singers")
public class SingerController {

    @Autowired
    private SingerRepository singerRepository;

    @Autowired
    private SingerService singerService;

    @GetMapping(path = "/findAll")
    public List<Singer> findAllSinger() {
        List<Singer> signers = (List<Singer>) singerRepository.findAll();
        return signers;
    }

    @PostMapping(path = "/createSinger",consumes = "application/json")
    public ResponseEntity<Singer> createSinger(@RequestBody Singer singer) {
        Singer singer1 = singerRepository.save(singer);
        URI uri = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(singer.getId()).toUri();
        return ResponseEntity.created(uri).body(singer1);
    }

    @GetMapping(path = "{/id}")
    public Singer findById(@PathVariable long id) {
        Optional<Singer> singer = singerRepository.findById(id);
        if(!singer.isPresent()) {
            throw new SingerNotFoundException("Can't find Singer by id"+id);
        }
        return singer.get();
    }

    @PutMapping(path = "{/id}")
    public Singer updateSingerById(@PathVariable long id,@RequestBody Singer singer) {
        Optional<Singer> singers = this.singerRepository.findById(id);
        if(!singers.isPresent()) {
            throw new SingerNotFoundException("Can't find Singer by id"+id);
        }
        Singer singer1 = singers.get();
        singer1.setFirstName(singer.getLastName());
        singer1.setLastName(singer.getLastName());
        return singer1;
    }

    @DeleteMapping("/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void deleteSingerById(@PathVariable long id) {
        Optional<Singer> singers = this.singerRepository.findById(id);
        if(!singers.isPresent()) {
            throw new SingerNotFoundException("Can't find Singer by id"+id);
        }
        singerRepository.deleteById(id);
    }

    @GetMapping(path = "/findByName")
    public SingerDto findAlbumBySingerName(@RequestParam String firstName) {
        SingerDto singers = singerService.findSingerFirstName(firstName);
        return singers;
    }

歌手庫:

public interface SingerRepository extends CrudRepository<Singer,Long> {

   Singer findByFirstName(String firstName);
}

歌手服務:

@Slf4j
@Service
public class SingerServiceImpl implements SingerService {
    @Autowired
    private SingerRepository singerRepository;


    private SingerDto findSingerWithAlbum(Singer singer) {
        SingerDto singerDto = new SingerDto();
        singerDto.setFirstName(singer.getFirstName());
        singerDto.setLastName(singer.getLastName());
        singerDto.setBirth_date(singer.getBirthDay());
        singerDto.setAlbums(singer.getAlbums());
        singerDto.setInstruments(singer.getInstruments());
        return singerDto;

    }

    @Override
    public SingerDto findSingerFirstName(String firstName) {
        Singer singer = singerRepository.findByFirstName(firstName);
        SingerDto singerDto = findSingerWithAlbum(singer);
        return singerDto;
    }
}

當我在郵遞員中調用method: findAlbumBySingerName ,如下所示:

http://localhost:8080/singers/findByName?firstName=Eric

它引發我錯誤:

org.springframework.http.converter.HttpMessageNotWritableException 

但是當我在字段中添加@JsonIgnore時: private List<Album> albums = new ArrayList<>(); @JsonIgnore private Set<Instrument> instruments = new HashSet<>(); SingerDTO中可以。 它獲得成功的firstName,lastnamebirthDay但沒有專輯和樂器。

當我調用方法findAlbumBySingerName時,我想獲取所有專輯和樂器。 我怎么能得到它?

我找到了解決方案。 我添加@JsonIgnoreProperties(),它可以工作。 謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM