6

私たちの Web アプリでは、Spring MVC 3.2 を使用して、さまざまなオブジェクトの多くのページ分割されたリストを表示し、リスト内の他のページへのリンクは次のように構成されています。

/servlet/path?pageNum=4&resultsPerPage=10&sortOrder=ASC&sortBy=name

ただし、URL には追加の要求パラメーター (検索フィルターなど) も含まれる場合があります。

したがって、次のようなコントローラーメソッドがあります。

@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list")
public String ajaxlistGroups(Model model,
   @RequestParam(value="pageNumber",required=false,defaultValue="0") Long pageNumber,
   @RequestParam(value="resultsPerPage",required=false,defaultValue="10") int resultsPerPage,
   @RequestParam(value="sortOrder",required=false,defaultValue="DESC") String sortOrder,
 @RequestParam(value="orderBy",required=false,defaultValue="modificationDate")String orderBy)  {
// create a PaginationCriteria object to hold this information for passing to Service layer
// do Database search
// return a JSP view name

}

そのため、この不器用なメソッド シグネチャがアプリ内で数回繰り返されることになり、各メソッドはページネーション情報を保持するために PaginationCriteria オブジェクトを作成し、入力を検証する必要があります。

これらのリクエスト パラメータが存在する場合、PaginationCriteria オブジェクトを自動的に作成する方法はありますか? たとえば、上記を次のように置き換えます。

@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list")
public String ajaxlistGroups(Model model, @SomeAnnotation? PaginationCriteria criteria,
  )  {
 ...
   }

つまり、Spring で通常の GET リクエストから requestParams の定義されたサブセットを取得し、それらを自動的にオブジェクトに変換して、コントローラー ハンドラー メソッドで使用できるようにする方法はありますか? 以前は @ModelAttribute しか使用していませんでしたが、ここでは適切ではないようです。

ありがとう!

4

1 に答える 1

7

Spring 3.2 は、リクエスト パラメータをカスタム Java Bean に自動的にマップする必要があります。

@RequestMapping(method = RequestMethod.GET, value="/ajax/admin/list")
public String ajaxlistGroups(Model model, PaginationCriteriaBean criteriaBean,
  )  {
 //if PaginationCriteriaBean should be populated as long as the field name is same as 
 //request parameter names.
}

Spring が魔法のようにこれを (@ModelAttribute なしで) 達成する方法はわかりませんが、上記のコードは私にとってはうまくいきます。

同じ目標を達成する別の方法があります。実際にはさらに多くのことを達成できます。それは春の AOP です。

<bean id="aspectBean" class="au.net.test.aspect.MyAspect"></bean>
<aop:config>
    <aop:aspect id="myAspect" ref="aspectBean">
    <aop:pointcut id="myPointcut"
        expression="execution(* au.net.test.web.*.*(..)) and args(request,bean,..)" />
    <aop:before pointcut-ref="myPointcut" method="monitor" />
    </aop:aspect>
</aop:config>

アプリケーションコンテキストでは、Aspect Bean とPointcutをadviceとともに宣言します。あなたの場合はアドバイスの前です

以下はソースコードです

    public class PaginationCriteriaBean {

        private String id;
        private String name;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
//custom Aspect
public class MyAspect {

    public void monitor( HttpServletRequest request,PaginationCriteriaBean bean){
        //populate your pagination bean
        bean.setId(request.getParameter("id"));
        bean.setName("my new name");
    }
}

    @RequestMapping(value="/app")
    public String appRoot(HttpServletRequest request,PaginationCriteriaBean bean){
        System.out.println(bean.getId());
        System.out.println(bean.getName());
        return "app";
    }

そうすることで、アスペクトはスプリング コントローラーをインターセプトし、リクエスト パラメーターに基づいて PaginationCriteriaBean を生成し、リクエストで元の値を変更することもできます。この AOP 実装により、ロギングや検証など、ページネーションに対してより多くのロジックを適用できるようになります。

于 2013-02-07T11:41:31.720 に答える