22

Spring MVCでは、リクエストパラメーターをリクエストを処理するメソッドパラメーターにバインドするのは簡単です。私はただ使用します@RequestParameter("name")。しかし、リクエスト属性で同じことを行うことはできますか?現在、リクエスト属性にアクセスしたい場合は、次のことを行う必要があります。

MyClass obj = (MyClass) request.getAttribute("attr_name");

しかし、私は本当に代わりにこのようなものを使用したいと思います:

@RequestAttribute("attr_name") MyClass obj

残念ながら、このようには機能しません。どういうわけかSpringの機能を拡張して、独自の「バインダー」を追加できますか?

編集 (私が達成しようとしていること):現在ログに記録されているユーザーをリクエスト属性内に保存します。したがって、現在ログに記録されているユーザー(ほとんどすべてのメソッド内にあります)にアクセスするときはいつでも、この余分な行を記述する必要がありuser = (User) request.getAttribute("user");ます。できるだけ短くしたいのですが、できればメソッドパラメータとして注入してください。または、インターセプターとコントローラーを介して何かを渡す別の方法を知っている場合は、それを聞いてうれしいです。

4

7 に答える 7

36

さて、モデルがどのように機能し、何のためにあるのか、ようやく少し理解できました@ModelAttribute。これが私の解決策です。

@Controller 
class MyController
{
    @ModelAttribute("user")
    public User getUser(HttpServletRequest request) 
    {
        return (User) request.getAttribute("user");
    }

    @RequestMapping(value = "someurl", method = RequestMethod.GET)
    public String HandleSomeUrl(@ModelAttribute("user") User user)  
    {
        // ... do some stuff
    }
}

注釈でマークされたgetUser()メソッドは、 でマークされたすべてのパラメーター@ModelAttributeを自動的に取り込みます。したがって、HandleSomeUrl メソッドが呼び出されると、呼び出しは次のようになります。少なくともこれは私が想像する方法です。すばらしいことに、ユーザーは追加の努力なしに JSP ビューからもアクセスできます。User user@ModelAttributeMyController.HandleSomeUrl(MyController.getUser(request))

これはまさに私の問題を解決しますが、さらに質問があります。これらのメソッドを配置できる共通の場所はあり@ModelAttributeますか?すべてのコントローラーで共通でしたか? preHandle()Interceptor のメソッド内からモデル属性を追加することはできますか?

于 2013-02-23T00:48:54.970 に答える
3

あなたが探しているのは次のとおりだと思います:

@ModelAttribute("attr_name") MyClass obj

コントローラーのメソッドのパラメーターでそれを使用できます。

Spring MVC の @ModelAttribute とは何ですか?

その質問は、Spring Documentation にリンクしており、使用例もいくつかあります。ここでそれを見ることができます

アップデート

ページをどのように設定しているかはわかりませんが、いくつかの異なる方法でユーザーをモデル属性として追加できます。ここでは、以下の簡単な例をセットアップします。

@RequestMapping(value = "/account", method = RequestMethod.GET)
public ModelAndView displayAccountPage() {
    User user = new User(); //most likely you've done some kind of login step this is just for simplicity
    return new ModelAndView("account", "user", user); //return view, model attribute name, model attribute
}

次に、ユーザーがリクエストを送信すると、Spring はユーザー属性をメソッドパラメーターの User オブジェクトにバインドします。

@RequestMapping(value = "/account/delivery", method = RequestMethod.POST)
public ModelAndView updateDeliverySchedule(@ModelAttribute("user") User user) {

    user = accountService.updateDeliverySchedule(user); //do something with the user

    return new ModelAndView("account", "user", user);
}
于 2013-02-22T20:02:57.803 に答える
2

最もエレガントではありませんが、少なくとも機能します...

@Controller
public class YourController {

    @RequestMapping("/xyz")
    public ModelAndView handle(
        @Value("#{request.getAttribute('key')}") SomeClass obj) {

        ...
        return new ModelAndView(...);
    }

}

ソース: http://blog.crisp.se/tag/requestattribute

于 2015-11-04T15:14:39.683 に答える
0

Spring WebMVC 4.x では、HandlerMethodArgumentResolver の実装を優先します

@Override
public boolean supportsParameter(MethodParameter parameter) {
    return parameter.getParameterAnnotation(RequestAttribute.class) != null;
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
        NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
    return webRequest.getAttribute(parameter.getParameterAnnotation(RequestAttribute.class).value(), NativeWebRequest.SCOPE_REQUEST);
}

}

次に、RequestMappingHandlerAdapter に登録します。

于 2016-01-19T03:51:27.997 に答える
0

はい、独自の「バインダー」をリクエスト属性に追加できます- spring-mvc-3-showcase を参照するか、@Peter Szanto のソリューションを使用してください。

または、他の回答で推奨されているように、ModelAttribute としてバインドします。

コントローラーに渡したいのはログインユーザーであるため、Spring Securityを検討することをお勧めします。次に、原則をメソッドに注入するだけです。

@RequestMapping("/xyz")
public String index(Principal principle) {
    return "Hello, " + principle.getName() + "!";
}
于 2016-01-07T12:55:01.053 に答える