【问题标题】:Spring REST @RequestMapping practicesSpring REST @RequestMapping 实践
【发布时间】:2016-11-18 22:43:22
【问题描述】:
@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);
    }
}

Q1:我希望第一种方法适用于网址“/players”(按预期工作),第二种方法适用于网址(“/players?team=xyz”、“/players ?团队=xyz&score=1000")。 spring 将方法 1 用于“/players?team=xyz”。即使我将分数指定为可选,除非我指定 2 个参数,否则弹簧不会使用第二种方法。如何解决这个问题以及编写控制器方法来处理这些类型的请求的最佳方式是什么,用户可以发送不同的可用参数集(如 param1 和 param2,只有 param1,只有 param2 等)。

Q2:对于第二种不同参数集的查询,如何在DAO层编写数据库查询。我应该使用不同的查询编写单独的方法还是使用多个 if 语句编写一个方法(例如,如果用户发送“团队”将团队添加到数据库查询,如果用户发送“分数”将其添加到数据库查询...)

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    您的第二个映射明确指定 两个 teamscore 请求参数必须存在,并且它们不在您的 /players?team=xyz 示例中。您在方法参数的绑定上写了required = false 的事实是无关紧要的——@RequestMapping 明确表示该参数必须存在于请求中。 (请注意,您可以有一个参数但没有值,如 /login?error 的常见 Spring Security URL。这将匹配 params = { "error" } 但没有值。)

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

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

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

    【讨论】:

    • 我在第二个映射中给出了 required = false
    • @LokeshCherukuri 您将其放在 parameter 绑定中,而不是请求映射中。更新了答案。
    猜你喜欢
    • 2011-05-18
    • 2014-07-11
    • 2020-09-30
    • 2019-04-26
    • 1970-01-01
    • 2023-03-18
    • 2017-11-13
    • 2016-07-02
    • 2018-12-30
    相关资源
    最近更新 更多