コントローラーから別のコントローラーにリダイレクトしています。しかし、2番目のコントローラーにモデル属性を渡す必要もあります。
モデルをセッションに入れたくありません。
助けてください。
最もエレガントな方法は、Spring MVCにカスタムFlashスコープを実装することだと思います。
フラッシュスコープの主なアイデアは、1つのコントローラーからのデータを2番目のコントローラーの次のリダイレクトまで保存することです。
カスタムスコープの質問に関する私の答えを参照してください。
このコードにない唯一のものは、次の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>
私はスプリング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";
}
_
redirectAttributes.addFlashAttribute(...) -> "redirect:..."
のみを使用しても同様に機能し、モデル属性を「再挿入」する必要はありませんでした。
ありがとう、aborskiy!
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 で私のブログの詳細を読む
@ControllerAdvice
を使用しました。Spring3.Xで利用可能かどうかを確認してください。 Spring 4.0で使用しています。
@ControllerAdvice
public class CommonController extends ControllerBase{
@Autowired
MyService myServiceInstance;
@ModelAttribute("userList")
public List<User> getUsersList()
{
//some code
return ...
}
}
すべての属性をリダイレクトに渡すだけの場合...
public String yourMethod( ...., HttpServletRequest request, RedirectAttributes redirectAttributes) {
if(shouldIRedirect()) {
redirectAttributes.addAllAttributes(request.getParameterMap());
return "redirect:/newPage.html";
}
}
同じ問題がありました。
ページの更新後にRedirectAttributesを使用すると、最初のコントローラーのモデル属性が失われました。それはバグだと思っていましたが、解決策を見つけました。最初のコントローラーでModelMapに属性を追加し、「リダイレクト」の代わりにこれを行います。
return "forward:/ nameOfView";
これにより、別のコントローラーにリダイレクトされ、最初のコントローラーのモデル属性も保持されます。
これがあなたが探しているものであることを願っています。私の英語でごめんなさい
@ 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;
}
}
たぶん、あなたはこのようにそれをすることができます:
最初のコントローラーでモデルを使用しないでください。他の共有オブジェクトにデータを保存し、それを2番目のコントローラーで取得できます。
this および this postを見てください。同様の問題についてです。
追伸.
おそらく、その共有データに session scoped Beanを使用できます...