代码之家  ›  专栏  ›  技术社区  ›  BaoTrung Tran

如何修复oneToMany中的HttpMessageNotWritableException在Spring boot中

  •  0
  • BaoTrung Tran  · 技术社区  · 7 年前

    我使用spring boot和hibernate在实体之间创建了一些关系。但当我得到数据时,它会给我带来错误:

    org.springframework.http.converter.HttpMessageNotWritableException.
    

    下面是我的代码:

    实体:

    唱歌的人课程:

    @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;
        }
    
    }
    

    专辑类别:

       @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();
        }
    
    
      }
    

    单控制器:

    @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;
        }
    

    SingerRepository:

    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;
        }
    }
    

    当我调用方法时: 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,lastname birthDay 但是没有专辑和乐器。

    我想在调用method时获取所有唱片和乐器 芬达尔布姆比辛格纳姆 .我怎么能得到它?。

    1 回复  |  直到 7 年前
        1
  •  0
  •   BaoTrung Tran    7 年前

    我找到了解决办法。我添加了@JsonIgnoreProperties(),它就起作用了。谢谢