2016-11-18 10 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(期待通りに働いていた)「/選手を」第2の方法のために働くために第一の方法を期待してい、 "/ players?team = xyz & score = 1000")。 "/ players?team = xyz"の春使用方法1です。私は2つのパラメータを指定しない限り、私はオプションとしてスコアを指定しても、春は2番目の方法を使用していません。これを解決する方法と、ユーザーが利用可能なパラメータの異なるセット(param1 & param2、param1のみ、param2のみなど)を送信できる、これらのタイプのリクエストを処理するコントローラメソッドを作成する最良の方法は何か。春REST @RequestMappingは練習

Q2: DAOレイヤでデータベースクエリを書き込む方法については、さまざまなパラメータセットを使用した2番目の種類のクエリについては、私は別のクエリを別々のメソッドまたは複数のifステートメントを持つ1つのメソッドを書く必要があります(ユーザーが 'チーム'をDBクエリに追加した場合、ユーザーが 'スコア'をDBクエリに追加した場合)...)

答えて

6

2番目のマッピングでは、teamscoreの両方のリクエストパラメータが存在しなければならないことが明示的に指定されており、その値は/players?team=xyzではありません。メソッドのパラメータのバインドにrequired = falseを書き込んだということは無関係です。@RequestMappingは、パラメータが要求に存在している必要があることを明示しています。 (/login?errorの共通春のセキュリティURLのように、あなたはパラメータが、無価値を持つことができることに注意してください。これはparams = { "error" }と一致しますが、値を持たないだろう。)

単一で正規ifステートメントを使用する方が簡単かもしれませんコントローラメソッド。

また、SpringのQuerydsl統合を調べると、クエリパラメータをPredicateとして解釈し、Springデータファインダメソッドに直接渡すことができます。

また、@GetMappingなどの新しいコンポジット便利アノテーションを調べると、読みやすいコードになります。

+0

2番目のマッピングでrequired = falseを指定しました。 –

+0

@LokeshCherukuriリクエストマッピングではなく、* parameter * bindingsに配置しました。答えを更新しました。 – chrylis