Spring REST @RequestMapping实践

lch*_*lch 4 java spring spring-mvc

@RestController
@RequestMapping(value = "/players")
public class REST {

    @RequestMapping(method = RequestMethod.GET)
    public List<Player> getAll() {
        return service.getAll();
    }

    @RequestMapping(method = RequestMethod.GET, params = {"team", "score"})
    public List<Player> getByPlayerAndScore(@RequestParam(value = "team") String team, 
                                                @RequestParam(value = "score", required = false) int score) {
        return service.getByPlayerAndScore(team, score);
    }
}
Run Code Online (Sandbox Code Playgroud)

Q1:我期待第一种方法为url"/ players"工作(按预期工作)和第二种方法为url工作("/ players?team = xyz","/ players?team = xyz&score = 1000").spring使用method1 for"/ players?team = xyz".即使我指定得分为可选,除非我指定2个参数,弹簧是不使用第二种方法.如何解决这个问题以及编写控制器方法来处理这些类型请求的最佳方法是什么,用户可以发送不同的可用参数集(例如param1和param2,只有param1,只有param2等).

Q2:对于具有不同参数集的第二类查询,如何在DAO层中编写数据库查询.我应该编写单独的方法,每个方法使用不同的查询或一个方法使用多个if语句(如果用户发送'团队'将团队添加到数据库查询,如果用户发送'分数'将其添加到数据库查询......)

chr*_*ke- 6

你的第二个映射明确指定这两者teamscore请求参数必须存在,他们是不是在你的例子/players?team=xyz.您required = false在方法参数的绑定上写的这一事实是无关紧要的 - @RequestMapping显式地说该参数必须存在于请求中.(请注意,您可以拥有一个参数但没有值,就像在常见的Spring Security URL中一样/login?error.这会匹配,params = { "error" }但没有值.)

if在单个控制器方法中使用常规语句可能更简单.

或者,您可能需要查看Spring的Querydsl集成,它允许您将查询参数解释为Predicate可以直接传递给Spring Data finder方法的查询参数.

此外,查看新的复合便利注释,例如@GetMapping,这将使您的代码更容易阅读.