Je redirige d'un contrôleur vers un autre contrôleur. Mais je dois également transmettre les attributs de modèle au second contrôleur.
Je ne veux pas mettre le modèle en session.
S'il vous plaît aider.
Je pense que la méthode la plus élégante consiste à implémenter Flash Scope personnalisé dans Spring MVC.
l'idée principale de la portée du flash est de stocker les données d'un contrôleur jusqu'à la prochaine redirection dans le second contrôleur.
Veuillez vous reporter à ma réponse à la question sur la portée personnalisée:
Bean scope MVC personnalisé Spring
La seule chose qui manque dans ce code est la configuration XML suivante:
<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>
J'utilise le printemps 3.2.3 et voici comment j'ai résolu le même problème.
1) Ajouté RedirectAttributes redirectAttributes à la liste des paramètres de méthode dans le contrôleur 1.
public String controlMapping1(
@ModelAttribute("mapping1Form") final Object mapping1FormObject,
final BindingResult mapping1BindingResult,
final Model model,
final RedirectAttributes redirectAttributes)
2) Dans la méthode, code ajouté pour ajouter l'attribut flash à redirectAttributes redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);
3) Ensuite, dans le deuxième paramètre de la méthode contoller use, annoté avec @ModelAttribute pour accéder aux attributs de redirection
@ModelAttribute("mapping1Form") final Object mapping1FormObject
Voici l'exemple de code du contrôleur 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";
}
Utiliser uniquement redirectAttributes.addFlashAttribute(...) -> "redirect:..."
fonctionnait également, sans avoir à "réinsérer" l'attribut de modèle.
Merci, aborskiy!
Vous pouvez le résoudre en utilisant org.springframework.web.servlet.mvc.support.RedirectAttributes.
Voici mon exemple de contrôleur.
@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";
}
en savoir plus sur mon blog à http://mayurshah.in/596/how-do-i-redirect-to-page-keeping-model-value
J'ai utilisé @ControllerAdvice
, s'il vous plaît vérifier est disponible dans le printemps 3.X; Je l'utilise au printemps 4.0.
@ControllerAdvice
public class CommonController extends ControllerBase{
@Autowired
MyService myServiceInstance;
@ModelAttribute("userList")
public List<User> getUsersList()
{
//some code
return ...
}
}
Si vous voulez simplement passer tous les attributs à rediriger ...
public String yourMethod( ...., HttpServletRequest request, RedirectAttributes redirectAttributes) {
if(shouldIRedirect()) {
redirectAttributes.addAllAttributes(request.getParameterMap());
return "redirect:/newPage.html";
}
}
J'ai eu le même problème.
Avec RedirectAttributes après actualisation de la page, les attributs de mon modèle du premier contrôleur ont été perdus. Je pensais que c'était un bogue, mais j'ai ensuite trouvé la solution . Dans le premier contrôleur, j'ajoute des attributs dans ModelMap et je fais ceci à la place de "redirect":
retourne " avant :/nameOfView";
Cela redirigera vers votre autre contrôleur et conservera également les attributs de modèle du premier.
J'espère que c'est ce que vous cherchez. Désolé pour mon anglais
Ajoutez tous les attributs de modèle à l'URL de redirection en tant que chaîne de requête.
En utilisant @ModelAttribute, nous pouvons passer le modèle d'un contrôleur à un autre contrôleur
[Entrée sur le premier contrôleur] [1]
[]: https://i.stack.imgur.com/rZQe5.jpg à partir du premier contrôleur jsp lie les données de formulaire avec le @ModelAttribute au bean utilisateur
@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;
}
}
Peut-être que vous pourriez le faire comme ceci:
N'utilisez pas le modèle dans le premier contrôleur. Stockez les données dans un autre objet partagé qui pourrait ensuite être récupéré par le second contrôleur.
Regardez ceci et ceci post. C'est à propos du même problème.
P.S.
Vous pourriez probablement utiliser session scoped bean pour les données partagées ...