sirve requestmapping que para mvc modelo modelandview ejemplo dispatcherservlet basico arquitectura redirect spring-mvc controllers modelattribute

redirect - requestmapping - ¿Cómo pasar los atributos del modelo de un controlador Spring MVC a otro controlador?



spring dispatcherservlet (10)

Estoy redireccionando de un controlador a otro controlador. Pero también necesito pasar los atributos del modelo al segundo controlador.

No quiero poner el modelo en sesión.

Por favor ayuda.


Agregue todos los atributos del modelo a la URL de redireccionamiento como cadena de consulta.


El uso de solo redirectAttributes.addFlashAttribute(...) -> "redirect:..." funcionó bien, no tuvo que "reinsertar" el atributo del modelo.

Gracias, aborskiy!


Puede resolverlo usando org.springframework.web.servlet.mvc.support.RedirectAttributes.

Aquí está mi muestra de controlador.

@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"; }

lea más en mi blog en http://mayurshah.in/596/how-do-i-redirect-to-page-keeping-model-value


Si solo quieres pasar todos los atributos para redirigir ...

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


Tal vez podrías hacerlo así:

No use el modelo en el primer controlador. Almacene datos en algún otro objeto compartido que luego pueda recuperar el segundo controlador.

Mira this y this publicación. Se trata de un problema similar.

PD

Probablemente podría usar beans de ámbito de sesión para esos datos compartidos ...


Tuve el mismo problema

Con RedirectAttributes después de actualizar la página, se han perdido los atributos de mi modelo del primer controlador. Estaba pensando que es un error, pero luego encontré la solución. En el primer controlador agrego atributos en ModelMap y hago esto en lugar de "redirigir":

return " forward : / nameOfView";

Esto redireccionará a su otro controlador y también conservará los atributos del modelo desde el primero.

Espero que esto sea lo que estás buscando. Lo siento por mi ingles


Utilicé @ControllerAdvice , compruebe que está disponible en Spring 3.X; Lo estoy usando en la primavera 4.0.

@ControllerAdvice public class CommonController extends ControllerBase{ @Autowired MyService myServiceInstance; @ModelAttribute("userList") public List<User> getUsersList() { //some code return ... } }


Utilizo la primavera 3.2.3 y aquí es cómo resolví un problema similar.
1) Se agregó RedirectAttributes redirectAttributes a la lista de parámetros del método en el controlador 1.

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

2) Dentro del método se agregó el código para agregar el atributo flash a redirectAttributes redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);

3) Luego, en el segundo controlador use el parámetro del método anotado con @ModelAttribute para acceder a los atributos de redirección

@ModelAttribute("mapping1Form") final Object mapping1FormObject

Aquí está el código de muestra del Controlador 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"; }

De 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"; }


Al usar @ModelAttribute podemos pasar el modelo de un controlador a otro controlador

[Entrada al primer controlador] [1]

[]: https://i.stack.imgur.com/rZQe5.jpg desde el primer controlador de la página jsp vincula los datos del formulario con @ModelAttribute al User 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; } }


Creo que la forma más elegante de hacerlo es implementar Flash Scope personalizado en Spring MVC.

la idea principal del alcance del flash es almacenar datos de un controlador hasta el próximo redireccionamiento en el segundo controlador

Por favor refiérase a mi respuesta sobre la pregunta del alcance personalizado:

Haba de alcance personalizada Spring MVC

Lo único que falta en este código es la siguiente configuración 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>