2016-11-18 2 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의 (? "팀 = XYZ/플레이어를위한"작업 URL (예상대로 일했다) "/ 플레이어"와 두 번째 방법 작동하는 첫 번째 방법을 기대하고, "/ players? team = xyz & 점수 = 1000"). "/ players? team = xyz"에 대한 스프링 사용 방법 1. 선택 사항으로 점수를 지정해도, 2 개의 매개 변수를 지정하지 않으면 봄은 두 번째 방법을 사용하지 않습니다. 이 문제를 해결하는 방법과 사용자가 사용 가능한 다른 매개 변수 세트 (예 : param1 & param2, param1 만, param2 만)를 보낼 수있는 이러한 유형의 요청을 처리하는 컨트롤러 메서드를 작성하는 가장 좋은 방법은 무엇입니까?봄 REST @RequestMapping은 실천

Q2 : 다른 매개 변수 집합을 사용하는 두 번째 유형의 쿼리의 경우 DAO 계층에서 데이터베이스 쿼리를 작성하는 방법. 내가 다른 쿼리 또는 사용자가 '점수'DB 쿼리에 추가 ... DB를 쿼리에 팀을 추가하는 경우 사용자가 보낸 '팀')와 같은 다른 쿼리 또는 하나의 방법으로 각각의 방법을 써야합니다

답변

6

두 번째 매핑은 teamscore 요청 매개 변수가 모두 있어야하며 사용자의 예로는 /players?team=xyz이 아닌 것으로 명시합니다. 메소드 매개 변수에 대한 바인딩에 required = false을 작성했다는 사실은 부적합합니다. @RequestMapping은 매개 변수가 요청에 존재해야한다고 분명하게 말합니다. (당신이 /login?error의 일반적인 봄 보안 URL에서와 같이 매개 변수 값없이 가질 수 있습니다.이 params = { "error" } 일치하는 것이지만 값이없는 것입니다.)

하나의 일반 if 문을 사용하는 것이 더 간단 수 있습니다 제어기 방법.

Spring의 Querydsl 통합을 살펴보면 쿼리 매개 변수를 Predicate으로 해석 할 수 있으며 Spring 데이터 찾기 메소드에 직접 전달할 수 있습니다.

@GetMapping과 같은 새로운 복합 편리 주석을 살펴보면 코드를 조금 더 간단하게 읽을 수 있습니다.

+0

두 번째 매핑에서 required = false를 지정했습니다. –

+0

@LokeshCherukuri 요청 매핑이 아닌 * 매개 변수 * 바인딩에 배치했습니다. 답변을 업데이트했습니다. – chrylis