11

Spring MVC で記述された Web サービスがあります。サードパーティの開発者が使用できます。私たちのメソッドには、多くのオプションのパラメーターがあります (クエリ文字列で渡されます)。

すべてのクエリ文字列パラメーターのスペルが正しく、タイプミスがないことを確認したいと考えています。それを行う簡単な方法はありますか?メソッド署名の例:

 @RequestMapping(value = {"/filter"}, method = RequestMethod.GET)
    @ResponseBody
    public List<MetricType> getMetricTypes(    
            @RequestParam(value = "subject", required = false) Long subjectId,
            @RequestParam(value = "area", required = false) Long areaId,
            @RequestParam(value = "onlyImmediateChildren", required = false) Boolean onlyImmediateChildren,   
            @RequestParam(value = "componentGroup", required = false) Long componentGroupId    
            ) throws Exception
    {
        //Some code
    }

誰かが「onlyImmediateChildren=true」ではなく「onlyImmediateChildren=true」パラメーター (タイプミス) を使用してこのメ​​ソッドを呼び出した場合、Spring MVC はタイプミスされたパラメーターを無視し、「onlyImmediateChildren」が null であると想定します。開発者は、わずかに間違った結果のリストを取得し、エラーに気付かないでしょう。このような問題は広範囲に及び、診断が困難になる可能性があります。このような問題を防ぐために、クエリ文字列に入力されたパラメーターがないことを確認したいと思います。

アップデート

クエリ文字列から実際のパラメーターのリストを抽出することができます。次に、許可されたパラメーターのリストと比較できます。許可されたパラメーター リストをハードコーディングすると、メソッド シグネチャが複製されます。メソッドの署名から (@RequestParam アノテーションなどで) 許可されたパラメーターのリストを抽出するのは簡単でしょうか?

どうもありがとう

マキシム

4

4 に答える 4

6

独自のHandlerInterceptorを実装できます。preHandleメソッドでは、@RequestParameterで注釈が付けられたすべてのHandlerMethodのパラメーターを取得できます。これらはすべて、リクエストで許可されるパラメーターになります。

于 2012-04-04T20:31:38.957 に答える
1

getParameterMapリクエストのメソッドを使用して、送信されたMapすべてのパラメータを取得し、許可されたすべてのパラメータのリストに対してキーを検証できます。requestオブジェクトをメソッド シグネチャに追加するだけで、オブジェクトを取得できるはずです。たとえば、次のようになります。

public List<MetricType> getMetricTypes(   
    HttpServletRequest request,
    @RequestParam(value = "subject", required = false) Long subjectId,
    ...
) throws Exception {
于 2012-04-04T11:39:34.217 に答える
1

Spring は、タイプの引数を介して、URL 文字列に存在するすべてのクエリ パラメーターを挿入します。

@RequestParam Map<String,String>存在する場合は、コントローラーメソッドで。

@RequestMapping(value = "", method = RequestMethod.GET, produces = {"application/json"})
 public HttpEntity<PagedResources<WebProductResource>> findAll(@RequestParam Map<String, String> allRequestParams){
...

}

その後、マップのキーを自分で検証できます。これを一般的に行う「エンタープライズ」な方法については、私の回答を参照してください: How to check spring RestController for unknown query params?

于 2018-01-15T04:31:58.497 に答える