问题描述
我正在尝试创建我的第一个 Spring Boot +CrudRepository + RestAPI +MySsql。在最初的小问题之后,它正在从数据库中插入和获取记录。但是,当我发送自定义查询时,它不起作用。我没有得到任何异常,但是在 Postman 中我得到 404 not found 状态。
这是我的实体类
package com.it.skill.movies;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="movie")
public class Movie {
@Id
@Column(name="mno")
private Integer mno;
@Column(name="mname")
private String mname;
@Column(name="rating")
private Integer rating;
@Column(name="genre")
private String genre;
public Movie() {}
public Movie(Integer mno,String mname,Integer rating,String genre) {
super();
this.mno = mno;
this.mname = mname;
this.rating = rating;
this.genre = genre;
}
public Integer getMno() {
return mno;
}
public void setMno(Integer mno) {
this.mno = mno;
}
public String getMname() {
return mname;
}
public void setMname(String mname) {
this.mname = mname;
}
public Integer getrating() {
return rating;
}
public void setrating(Integer rating) {
this.rating = rating;
}
public String getGenre() {
return genre;
}
public void setGenre(String genre) {
this.genre = genre;
}
@Override
public String toString() {
return "Movie [mno=" + mno + ",mname=" + mname + ",rating=" + rating + ",genre=" + genre + "]";
}
}
存储库接口:这是我编写查询的地方。有没有替代方法,因为它是一个非常简单的查询?
package com.it.skill.repo;
import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.it.skill.movies.Movie;
@Repository
public interface IMovieRepo extends CrudRepository<Movie,Integer>{
@Query("SELECT m FROM Movie m where m.genre=?1")
public List<Movie> findByGenre(String genre);
}
服务类
package com.it.skill.service;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.it.skill.movies.Movie;
import com.it.skill.repo.IMovieRepo;
@Service
public class IMovieService {
@Autowired
private IMovieRepo movieRepository;
public Integer addMovie(Movie movie)
{
//Movie movie = new Movie();
movieRepository.save(movie);
return movie.getMno();
}
public List<Integer> addMovies(List<Movie> lstMovie)
{
//Movie movie = new Movie();
List<Integer> lstrating = new ArrayList();
for(Movie movie : lstMovie)
{
movieRepository.save(movie);
lstrating.add(movie.getMno());
}
return lstrating;
}
public List<Movie> getAllMovies()
{
List<Movie> lstMovie = new ArrayList<Movie>();
movieRepository.findAll().forEach(e->lstMovie.add(e));
return lstMovie;
}
public List<Movie> findMoviesByGenre(String genre)
{
List<Movie> lstMovie = new ArrayList<Movie>();
movieRepository.findByGenre(genre);
return lstMovie;
}
}
控制器类:
package com.it.skill.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.it.skill.movies.Movie;
import com.it.skill.service.IMovieService;
@RestController
public class MovieController {
@Autowired
private IMovieService movieService;
//add single project
@PostMapping(path = "/movie/add/",consumes = "application/json")
public ResponseEntity<String> addMovie(@RequestBody Movie movie) {
Integer irating = movieService.addMovie(movie);
if(irating!=null)
{
return new ResponseEntity<String>("Movie saved with rating: " +irating,HttpStatus.CREATED);
}
return new ResponseEntity<String>("Movie not saved",HttpStatus.NOT_ACCEPTABLE);
}
@PostMapping(path = "/movies/add/",consumes = "application/json")
public ResponseEntity<List<Integer>> addMovies(@RequestBody List<Movie> lsMovie) {
List<Integer> lsrating = movieService.addMovies(lsMovie);
if(!lsrating.isEmpty())
{
return new ResponseEntity<List<Integer>>(lsrating,HttpStatus.CREATED);
}
return new ResponseEntity<List<Integer>>(HttpStatus.NOT_ACCEPTABLE);
}
@GetMapping(path = "/movies/",produces = { "application/json","application/xml" })
public ResponseEntity<List<Movie>> getAllMovies() {
List<Movie> lsMovies = movieService.getAllMovies();
if(!lsMovies.isEmpty())
{
return new ResponseEntity<List<Movie>>(lsMovies,HttpStatus.FOUND);
}
return new ResponseEntity<List<Movie>>(HttpStatus.NOT_FOUND);
}
@GetMapping(path = "/movies/bygenre/{genre}","application/xml" })
public ResponseEntity<List<Movie>> getMoviesByGenre(@PathVariable("genre") String genre) {
List<Movie> lsMovies = movieService.findMoviesByGenre(genre);
if(!lsMovies.isEmpty())
{
return new ResponseEntity<List<Movie>>(lsMovies,HttpStatus.FOUND);
}
return new ResponseEntity<List<Movie>>(HttpStatus.NOT_FOUND);
}
}
以下是应用属性
spring.application.name=Restful-App-Movies
server.servlet.context-path=/Restful-App-Movies
server.port=8082
## MysqL
spring.datasource.url=jdbc:MysqL://localhost:3306/sakila
spring.datasource.username=root
spring.datasource.password=Asand9876@
当我使用 http://localhost:8082/Restful-App-Movies/movies/bygenre/"Horror" 在邮递员中使用 GET 方法时,此链接会抛出 404 not found 错误。
为什么下面这个 CrudRepository 接口中的方法不能按预期工作? @Query("SELECT m FROM Movie m where m.genre=?1") 公共列表 findByGenre(String 类型);
解决方法
在 addMovies() 函数上方添加@Transactional 注解
,您应该从请求中删除双引号以使其正常工作。 正确的语法应该是:
http://localhost:8082/Restful-App-Movies/movies/bygenre/Horror
,
我在服务类中犯了错误。我声明了列表对象但没有返回列表。当我更新我的服务方法时,它就像魅力一样。这是更新的方法。
public List<Movie> findMoviesByGenre(String genre)
{
List<Movie> lstMovie = new ArrayList<Movie>();
lstMovie = movieRepository.findByGenre(genre);
return lstMovie;
}
,
在 @RequestMapping
注释上方添加 @RestController
。于是就变成了
@RequestMapping
@RestController
public class MovieController {
....
}