web-dev-qa-db-fra.com

Comment transmettre les attributs de modèle d'un contrôleur Spring MVC à un autre contrôleur?

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.

36
ashishjmeshram

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>
12
danny.lesnik

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";  
}
104
aborskiy

Utiliser uniquement redirectAttributes.addFlashAttribute(...) -> "redirect:..." fonctionnait également, sans avoir à "réinsérer" l'attribut de modèle.

Merci, aborskiy!

11
pkopac

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

3
Mayur Shah

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 ...
    }
}
0
JPRLCol

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";
    }
}
0
Michal Ambrož

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

0
DinkoCejvanovic

Ajoutez tous les attributs de modèle à l'URL de redirection en tant que chaîne de requête.

0
Pokuri

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;
        }
    }
0
john kothapeta

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 ... 

0
Matjaz Muhic