2016-11-18 129 views
4
@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:我期待第一种方法为URL“/玩家”(如预期工作)和第二种方法的工作,为的URL(“/?玩家组队= XYZ”的工作, “/ players?team = xyz & score = 1000”)。 “/ players?team = xyz”使用spring1方法。即使我指定分数作为可选项,除非我指定2个参数,春天是不使用第二种方法。如何解决这个问题,以及编写控制器方法以处理这些类型的请求的最佳方式,用户可以发送不同的可用参数集(如param1 & param2,仅param1,仅param2等)。弹簧安置@RequestMapping实行

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

回答

6

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

这可能是简单的在一个单一的使用正if声明控制器方法。或者,您可能想要查看Spring的Querydsl集成,它允许您将查询参数解释为Predicate,它可以直接传递给Spring Data finder方法。

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

+0

我给需要第二映射 –

+0

=假@LokeshCherukuri你把在*参数*绑定,而不是请求映射。更新了答案。 – chrylis