Как передать атрибуты модели с одного контроллера Spring MVC на другой контроллер? - PullRequest
36 голосов
/ 15 сентября 2011

Я перенаправляю с контроллера на другой контроллер. Но мне также нужно передать атрибуты модели второму контроллеру.

Я не хочу ставить модель на сеанс.

Пожалуйста, помогите.

Ответы [ 10 ]

108 голосов
/ 27 июня 2013

Я использую Spring 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) Внутри метода добавленкод для добавления атрибута flash в redirectAttributes redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);

3) Затем во втором контроллере используйте параметр метода, аннотированный @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";  
}
13 голосов
/ 12 января 2014

Использование только redirectAttributes.addFlashAttribute(...) -> "redirect:..." также сработало, не нужно было "вставлять" атрибут модели.

Спасибо, аборский!

12 голосов
/ 15 сентября 2011

Я думаю, что самый элегантный способ сделать это - реализовать собственный Flash Scope в Spring MVC.

Основная идея для области флэш-памяти заключается в сохранении данных от одного контроллера до следующего перенаправления во втором контроллере

Пожалуйста, обратитесь к моему ответу на вопрос о пользовательской области:

Spring MVC пользовательская область действия

Единственное, чего не хватает в этом коде, это следующая конфигурация 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 голосов
/ 10 мая 2016

Вы можете решить эту проблему, используя 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

0 голосов
/ 12 июня 2018

Используя @ModelAttribute, мы можем передать модель с одного контроллера на другой контроллер

[Вход в первый контроллер] [1]

[]: https://i.stack.imgur.com/rZQe5.jpg со страницы jsp первый контроллер связывает данные формы с @ModelAttribute с пользовательским компонентом

@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 голосов
/ 05 августа 2017

Если вы хотите просто передать все атрибуты для перенаправления ...

public String yourMethod( ...., HttpServletRequest request, RedirectAttributes redirectAttributes) {
    if(shouldIRedirect()) {
        redirectAttributes.addAllAttributes(request.getParameterMap());
        return "redirect:/newPage.html";
    }
}
0 голосов
/ 02 апреля 2016

У меня была такая же проблема.

С RedirectAttributes после обновления страницы атрибуты моей модели с первого контроллера были потеряны. Я думал, что это ошибка, но потом я нашел решение. В первом контроллере я добавляю атрибуты в ModelMap и делаю это вместо «перенаправления»:

return " forward : / nameOfView";

Это перенаправит на ваш другой контроллер, а также сохранит атрибуты модели от первого.

Я надеюсь, это то, что вы ищете. Извините за мой английский

0 голосов
/ 29 октября 2015

Я использовал @ControllerAdvice, пожалуйста, проверьте, доступен ли в Spring 3.X;Я использую его в Spring 4.0.

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

    @ModelAttribute("userList")
    public List<User> getUsersList()
    {
       //some code
       return ...
    }
}
0 голосов
/ 15 сентября 2011

Может быть, вы могли бы сделать это так:

Не используйте модель в первом контроллере. Сохраните данные в каком-либо другом общем объекте, который затем может быть получен вторым контроллером.

Посмотрите на этот и этот пост. Это примерно аналогичная проблема.

приписка

Возможно, вы могли бы использовать bean-объект сеанса для этих общих данных ...

0 голосов
/ 15 сентября 2011

Добавить все атрибуты модели в URL-адрес перенаправления в виде строки запроса.

...