首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring数据JPA OneTo多个后映射问题

Spring数据JPA OneTo多个后映射问题
EN

Stack Overflow用户
提问于 2020-08-11 04:32:54
回答 2查看 571关注 0票数 0

我正在尝试为视频库开发REST。使用电影控制器,我希望获取、发布、放置和删除电影实体(其中有列id (生成的类型标识,它是主键)、标题、类型、比率和数量)。

“体裁”是另一个实体,因为一部电影只能是一种类型(在我的项目中)。

我希望我的api接受以下JSON请求

代码语言:javascript
复制
{
  "title":"John Wick",
  "rate":8.2,
  "numberInStock":19,
  "genreId":2
}

因此,genreId引用Id类型表,并指向Id 2的体裁名称,即“动作”

当我试图发布像下面这样的电影时,邮递员出现了415个错误

代码语言:javascript
复制
{
    "timestamp": "2020-08-11T03:57:31.792+00:00",
    "status": 415,
    "error": "Unsupported Media Type",
    "message": "",
    "path": "/video-library/movies/"
}

有人,请指点我哪里做错了

Movie.java

代码语言:javascript
复制
@Entity
@Table
public class Movie {
    
  @Id
  @GeneratedValue (strategy = GenerationType.IDENTITY)
  @Column(name = "id")
  private Integer id;
  private String title;
  private int rate;
  
  @Column(name = "numberInStock")
  private int numberInStock;
  
  
  @ManyToOne(targetEntity = Genre.class)
  @JoinColumn(name="genreId")
  private Genre genre;

  public Movie() {

  }

public Movie(Integer id, String title, int rate, int numberInStock, Genre genre) {
    super();
    this.id = id;
    this.title = title;
    this.rate = rate;
    this.numberInStock = numberInStock;
    this.genre = genre;
}

public Integer getId() {
    return id;
}

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

public String getTitle() {
    return title;
}

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

public int getRate() {
    return rate;
}

public void setRate(int rate) {
    this.rate = rate;
}

public int getNumberInStock() {
    return numberInStock;
}

public void setNumberInStock(int numberInStock) {
    this.numberInStock = numberInStock;
}

@JsonManagedReference 
public Genre getGenre() {
    return genre;
}

public void setGenre(Genre genre) {
    this.genre = genre;
}


}

Genre.java

代码语言:javascript
复制
@Entity
@Table
public class Genre {

@Id
@Column(name="genreId")
@GeneratedValue(strategy = GenerationType.IDENTITY)

private Integer id;

@OneToMany(mappedBy="genre", cascade = CascadeType.ALL)
private Set<Movie> movie;

@Column(name ="genre")
private String genre;



public Genre() {

}



public Genre(Integer id, Set<Movie> movie, String genre) {
    super();
    this.id = id;
    this.movie = movie;
    this.genre = genre;
}



public Integer getId() {
    return id;
}



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

@JsonBackReference
public Set<Movie> getMovie() {
    return movie;
}


public void setMovie(Set<Movie> movie) {
    this.movie = movie;
}



public String getGenre() {
    return genre;
}



public void setGenre(String genre) {
    this.genre = genre;
}



}

MovieRestcontroller

代码语言:javascript
复制
@CrossOrigin(origins = "http://localhost:3000")
@RestController
@RequestMapping("/video-library")
public class MovieController {

  @Autowired
  private  MoiveRepository movieRepository;



  //CRATE
  //Add movie
  @PostMapping("/movies")
  public Movie createMovie(@RequestBody Movie movie)
  {
    return movieRepository.save(movie);
  }

  //READ
  //Get a list of all movies
  @GetMapping("/movies")
  public List<Movie> getAllMovie(){
    return movieRepository.findAll();
  }

  //Get single movie
  @GetMapping("/movies/{id}")
  public ResponseEntity<Movie> getMovieById(@PathVariable Integer id){
    Movie movie = movieRepository.findById(id).orElseThrow(()->
      new ResourseNotFoundException("404 Error: Movie not exist with the Given "+id));
    return ResponseEntity.ok(movie);
  }

  //UPDATE
  //Updated movie
  @PutMapping("/movies/{id}")
  public ResponseEntity <Movie> updateMovie(@PathVariable Integer id, @RequestBody Movie movieDetails){
    Movie movie = movieRepository.findById(id).orElseThrow((() ->
      new ResourseNotFoundException("404 Error: Movie not exist with the Given "+id)));


    movie.setTitle(movieDetails.getTitle());
    movie.setRate(movieDetails.getRate());
//    movie.setGenre(movieDetails.getGenre());
    movie.setNumberInStock(movieDetails.getNumberInStock());

    Movie updateMovie = movieRepository.save(movie);
    Map<String,Boolean> response = new HashMap<>();
    response.put("Movie Updated Successfully",Boolean.TRUE);
    return  ResponseEntity.ok(updateMovie);
  }

  //DELETE
  //Delete movie
  @DeleteMapping("/movies/{id}")
  public ResponseEntity <Map<String, Boolean>> deleteMovie(@PathVariable Integer id){
    Movie employee = movieRepository.findById(id)
      .orElseThrow((() -> new ResourseNotFoundException("404 Error: Movie not exist with the Given "+id)));
    movieRepository.delete(employee);
    Map<String,Boolean> response = new HashMap<>();
    response.put("Movie Deleted Successfully",Boolean.TRUE);
    return ResponseEntity.ok(response);
  }
  
  
}

GenreController

代码语言:javascript
复制
@CrossOrigin(origins = "http://localhost:3000")
@RestController
@RequestMapping("/video-library")
public class GenreController {
    @Autowired
    public GenreRepository genreRepository;
    
    
      @PostMapping("/genre")
      public Genre createGenre(@RequestBody Genre genre)
      {
        return genreRepository.save(genre);
      }
      
      @GetMapping("/genre")
      public List<Genre> getAllGenre(){
        return genreRepository.findAll();
      }


      @GetMapping("/genre/{id}")
      public ResponseEntity<Genre> getGenreById(@PathVariable Integer id){
        Genre genre = genreRepository.findById(id).orElseThrow(()->
          new ResourseNotFoundException("404 Error: Genre not exist with the Given "+id));
        return ResponseEntity.ok(genre);
      }
}
EN

回答 2

Stack Overflow用户

发布于 2020-08-11 05:02:49

尝试在您的consumes@PostMapping注释中使用@GetMapping@PostMapping属性,如:

代码语言:javascript
复制
@PostMapping(path = "/genre",consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)

@GetMapping(path = "/movies/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)

你传递了错误的请求。您的请求应该包含genre作为对象。试一试

代码语言:javascript
复制
{
  "title":"John Wick",
  "rate":8.2,
  "numberInStock":19,
  "genre":{"genreId":2}
}
票数 0
EN

Stack Overflow用户

发布于 2020-08-11 05:09:41

您使用哪个客户端来测试REST?

所有客户端都有允许在请求中设置Content-type:application/json头的选项。

在Postman中,选择Body选项卡,然后选择raw,然后将右边的TEXT更改为JSON

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63351551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档