web-dev-qa-db-ja.com

あるSpring MVCコントローラーから別のコントローラーにモデル属性を渡す方法は?

コントローラーから別のコントローラーにリダイレクトしています。しかし、2番目のコントローラーにモデル属性を渡す必要もあります。

モデルをセッションに入れたくありません。

助けてください。

36
ashishjmeshram

最もエレガントな方法は、Spring MVCにカスタムFlashスコープを実装することだと思います。

フラッシュスコープの主なアイデアは、1つのコントローラーからのデータを2番目のコントローラーの次のリダイレクトまで保存することです。

カスタムスコープの質問に関する私の答えを参照してください。

Spring MVCカスタムスコープBean

このコードにない唯一のものは、次のxml構成です。

<bean id="flashScopeInterceptor" class="com.Vanilla.springMVC.scope.FlashScopeInterceptor" />
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  <property name="interceptors">
    <list><ref bean="flashScopeInterceptor"/></list>
  </property>
</bean>
12
danny.lesnik

私はスプリング3.2.3を使用していますが、ここで同様の問題を解決しました。
1)RedirectAttributes redirectAttributesをコントローラー1のメソッドパラメーターリストに追加しました。

_public String controlMapping1(
        @ModelAttribute("mapping1Form") final Object mapping1FormObject,
        final BindingResult mapping1BindingResult,
        final Model model, 
        final RedirectAttributes redirectAttributes)
_

2)メソッド内に、redirectAttributes redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);にflash属性を追加するコードを追加しました

3)次に、2番目のコントローラーで@ModelAttributeアノテーションが付けられたメソッドパラメーターを使用して、リダイレクト属性にアクセスします

_@ModelAttribute("mapping1Form") final Object mapping1FormObject
_

これがコントローラー1のサンプルコードです。

_@RequestMapping(value = { "/mapping1" }, method = RequestMethod.POST)
public String controlMapping1(
        @ModelAttribute("mapping1Form") final Object mapping1FormObject,
        final BindingResult mapping1BindingResult,
        final Model model, 
        final RedirectAttributes redirectAttributes) {

    redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);

    return "redirect:mapping2";
}   
_

Contoller 2から:

_@RequestMapping(value = "/mapping2", method = RequestMethod.GET)
public String controlMapping2(
        @ModelAttribute("mapping1Form") final Object mapping1FormObject,
        final BindingResult mapping1BindingResult,
        final Model model) {

    model.addAttribute("transformationForm", mapping1FormObject);

    return "new/view";  
}
_
108
aborskiy

redirectAttributes.addFlashAttribute(...) -> "redirect:..."のみを使用しても同様に機能し、モデル属性を「再挿入」する必要はありませんでした。

ありがとう、aborskiy!

13
pkopac

Org.springframework.web.servlet.mvc.support.RedirectAttributesを使用して解決できます。

これが私のコントローラーのサンプルです。

@RequestMapping(method = RequestMethod.POST)
    public String eligibilityPost(
            @ModelAttribute("form") @Valid EligibiltyForm form,
            Model model,
            RedirectAttributes redirectAttributes) {
        if(eligibilityService.validateEligibility(form)){
            redirectAttributes.addFlashAttribute("form", form);
            return "redirect:<redirect to your page>";
        }
       return "eligibility";
    }

http://mayurshah.in/596/how-do-i-redirect-to-page-keeping-model-value で私のブログの詳細を読む

3
Mayur Shah

@ControllerAdviceを使用しました。Spring3.Xで利用可能かどうかを確認してください。 Spring 4.0で使用しています。

@ControllerAdvice 
public class CommonController extends ControllerBase{
@Autowired
MyService myServiceInstance;

    @ModelAttribute("userList")
    public List<User> getUsersList()
    {
       //some code
       return ...
    }
}
0
JPRLCol

すべての属性をリダイレクトに渡すだけの場合...

public String yourMethod( ...., HttpServletRequest request, RedirectAttributes redirectAttributes) {
    if(shouldIRedirect()) {
        redirectAttributes.addAllAttributes(request.getParameterMap());
        return "redirect:/newPage.html";
    }
}
0
Michal Ambrož

同じ問題がありました。

ページの更新後にRedirectAttributesを使用すると、最初のコントローラーのモデル属性が失われました。それはバグだと思っていましたが、解決策を見つけました。最初のコントローラーでModelMapに属性を追加し、「リダイレクト」の代わりにこれを行います。

return "forward:/ nameOfView";

これにより、別のコントローラーにリダイレクトされ、最初のコントローラーのモデル属性も保持されます。

これがあなたが探しているものであることを願っています。私の英語でごめんなさい

0
DinkoCejvanovic

@ ModelAttributeを使用することで、あるコントローラーから別のコントローラーにモデルを渡すことができます

[最初のコントローラーへの入力] [1]

[]: https://i.stack.imgur.com/rZQe5.jpg jspページの最初のコントローラーは、@ ModelAttributeを持つフォームデータをユーザーBeanにバインドします

@Controller
public class FirstController {
    @RequestMapping("/fowardModel")
    public ModelAndView forwardModel(@ModelAttribute("user") User u) {
        ModelAndView m = new ModelAndView("forward:/catchUser");
        m.addObject("usr", u);
        return m;
    }
}

@Controller
public class SecondController {
    @RequestMapping("/catchUser")
    public ModelAndView catchModel(@ModelAttribute("user")  User u) {
        System.out.println(u); //retrive the data passed by the first contoller
        ModelAndView mv = new ModelAndView("userDetails");
        return mv;
    }
}
0
john kothapeta

たぶん、あなたはこのようにそれをすることができます:

最初のコントローラーでモデルを使用しないでください。他の共有オブジェクトにデータを保存し、それを2番目のコントローラーで取得できます。

this および this postを見てください。同様の問題についてです。

追伸.

おそらく、その共有データに session scoped Beanを使用できます...

0
Matjaz Muhic