2012-04-25 5 views
3

Spring MVCを使用して、org.springframework.ui.Modelを任意のコントローラ内のメソッドパラメータに指定しないようにする方法はありますか?言い換えればコントローラのモデルをどのように因数分解するのですか?

、私は現在、このようにそれをやっている:

public abstract class AbstractController { 

    @Autowired 
    protected MultipartHttpServletRequest request; 

} 

@Controller 
public class SigninController extends AbstractController { 

    @RequestMapping(value = "/signin", method = RequestMethod.GET) 
    public String signin(@ModelAttribute User user, Model model) { 
     // do stuff with user (parameter) 
     // do stuff with model (parameter) <-- 
     // do stuff with request (attribute) 
     return "/signin/index"; 
    } 

} 

そして、私はそのようにやりたい:

public abstract class AbstractController { 

    @Autowired 
    protected MultipartHttpServletRequest request; 

    @Autowired 
    protected Model model; 

} 

@Controller 
public class SigninController extends AbstractController { 

    @RequestMapping(value = "/signin", method = RequestMethod.GET) 
    public String signin(@ModelAttribute User user) { 
     // do stuff with user (parameter) 
     // do stuff with model (attribute) <-- 
     // do stuff with request (attribute) 
     return "/signin/index"; 
    } 

} 

しかし、URLを呼び出すときに、例外がスローされます:

...Could not autowire field: protected org.springframework.ui.Model... 
...No matching bean of type [org.springframework.ui.Model] found for dependency... 

org.springframework.ui.ModelMapを使用すると同じエラーが発生します。

どのような有名なソリューションですか?

ありがとうございました:)

+0

@ sp00m..iこれを行う目的を知りたいのはちょっと不思議です。 – raddykrish

+0

@raddykrish私はコントローラを読みやすく、nパラメータ(3 sp00m

+0

私はあなたのポイントを理解しています。 ModelとModelMapはSpringの管理クラスではないので、私はこのAutowiringを実行できるかどうか疑問に思っています。 – raddykrish

答えて

1

最終的に解決策が見つかりました。私はゲームはそれだけの価値があるか分からないが、それは動作します:)

まず、あなたのAbstractControllerでこれらのものを追加します。

public abstract class AbstractController { 

    @Autowired 
    protected MultipartHttpServletRequest request; 

    protected ModelMap model; 

    public void setModel(ModelMap model) { 
     this.model = model; 
    } 

    public ModelMap getModel() { 
     return model; 
    } 

} 

そこで、このようなorg.springframework.web.servlet.HandlerInterceptorを実装するインターセプタを作成します。

public class UserContextInterceptor implements HandlerInterceptor { 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException { 
     if (handler instanceof AbstractController) { 
      AbstractController controller = (AbstractController) handler; 
      controller.setModel(new ModelMap()); 
     } 
     return true; 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { 
     if (handler instanceof AbstractController && modelAndView != null) { 
      AbstractController controller = (AbstractController) handler; 
      modelAndView.addAllObjects(controller.getModel()); 
     } 
    } 

    @Override 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
    } 

} 
最後に

、あなたのapplicationContext.xmlでこれらの行を追加します。

<mvc:interceptors> 
    <bean class="path.to.my.just.created.UserContextInterceptor" /> 
</mvc:interceptors> 

もちろんコントローラにはAbstractControllerを実装してください。

ここにあります!コントローラメソッドのパラメータ内にrequestmodelも指定する必要はありません。私はそのトリックの有用性について本当に確信していませんが、ええ。それは狂った開発者をより幸せにすることができる場合:)

まだ開いて簡単だ解決策。

+0

前のコメントを確認しましたか?私はこのようなことを言いましたが(しかし、狙いを定めたものではありません)。とにかくこの解決策を知って良い。 – raddykrish

+0

はい、ご回答いただきありがとうございます。私はそれを試してみました。良い点は、例外がもうスローされなかったため、Beanは正しくautowired(NullPointerExceptionもスローされませんでした)でした。しかしモデルはビューに送られなかったので、私はJSPページから自分の属性にアクセスしていませんでした。しかし、とにかくあなたの答えをありがとう! – sp00m

+0

オハイオ州...しかし、私はあなたのインターセプタで 'modelAndView.addModel());'のように使用しているので、文字列ではなく戻りModelViewでモデルをビューに送ることができると思います。コントローラでも使用されます。とにかく私が言及したオプションを試したことを知っていて良かった。ありがとう!!! – raddykrish

関連する問題