代码之家  ›  专栏  ›  技术社区  ›  M.K

实现easy REST服务的问题-Spring MVC

  •  0
  • M.K  · 技术社区  · 6 年前

    我有一个Springboot应用程序(videoclub应用程序)。我认为没有必要向您展示所有代码,因为这将非常冗长。但效果很好。

    班级 Film FilmRepository 使用一些方法、控制器、数据库JPA和HTML文件。一切正常。 我不是在寻找一个代码解决方案,而是一个“概念”解决方案 ,只是想知道我是否正确实现了REST服务。

    我现在想添加一个非常简单的REST服务(添加一个类“MyRestController”),它只需在URL中添加电影名称即可搜索电影。

    因此,除了我的控制器之外,我想添加这个RestController只是为了做一件简单的事情:如果我在URL中添加电影的名称,它将使用常规MVC方法进行搜索。

    但加上我认为的解决方案,我就犯了这个错误:

    出现意外错误(类型=未找到,状态=404)。 无可用消息

    因此,当浏览HTML内容到页面以搜索电影时,并将其添加到 /buscar 电影名称(我在db中有) /buscar/Interstellar ,显示之前的错误。

    @CrossOrigin
    @RestController
    public class MyRestController {
    
        @Autowired
        private FilmRepository filmRepo;
    
        @RequestMapping(value = "/buscar", method = RequestMethod.GET)
        public ResponseEntity<List<Film>> getFilms(@RequestParam String Title) {
            List<Film> pelis = (List<Film>) filmRepo.findByTitle(Title);
            HttpStatus status = HttpStatus.OK;
            ResponseEntity<List<Film>> response = new ResponseEntity<>(pelis, status);
            return response;
        }
    }
    

    得到这个错误让我觉得页面知道它必须做些什么,但可能在获取它时遇到了问题(可能是由于字符串、iterable事物、列表或类似的问题,JSON)。但我不知道rest服务背后的“理论”在MyRestController中是否正确。

    电影存储库:

    public interface FilmRepository extends CrudRepository<Film, Long>{
    
        Iterable<Film> findByTitle(String Title);
    }
    

    (常规控制器中的MVC方法)

    @RequestMapping("/buscar")
        public ModelAndView processSearch(@RequestParam(value = "title", required = false) String title) {
            if (title == null || title == "") {
                Iterable<Film> films = filmRepo.findAll();
                return new ModelAndView("buscar").addObject("films", films);
            }
            Iterable<Film> films = filmRepo.findByTitle(title);
            return new ModelAndView("buscar").addObject("films", films);
    
        }
    
    2 回复  |  直到 5 年前
        1
  •  0
  •   Vyncent    6 年前

    你说的是 @PathVariable

    @RequestMapping(path={"/buscar","/buscar/{title}"})
    public ModelAndView processSearch(@PathVariable(value = "title", required=false) String title) {
    
        2
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    最后,问题出在@RequestParam上,它让您在URL中搜索类似于:/buscar?标题=星际

    @RequestMapping(value = "/buscar/{title}", method = RequestMethod.GET)
        public ResponseEntity<List<Film>> getFilms(@PathVariable String title) {
        List<Film> pelis = (List<Film>) filmRepo.findByTitle(title);
        HttpStatus status = HttpStatus.OK;
        ResponseEntity<List<Film>> response = new ResponseEntity<>(pelis, status);
        return response;
    }
    

    使用此REST服务,您可以通过URL进行搜索,如“/巴士/星际”。

    结果将为您提供JSON内容以及对象胶片的所有信息。