web-dev-qa-db-de.com

Wie übergeben Sie Modellattribute von einem Spring MVC-Controller an einen anderen Controller?

Ich leite von einem Controller zu einem anderen Controller um. Ich muss aber auch Modellattribute an den zweiten Controller übergeben. 

Ich möchte das Modell nicht in Sitzung setzen.

Bitte helfen.

36
ashishjmeshram

Ich denke, der eleganteste Weg, dies zu tun, ist die Implementierung eines benutzerdefinierten Flash Scope in Spring MVC.

die Hauptidee für das Flash-Scope besteht darin, Daten von einem Controller bis zur nächsten Weiterleitung im zweiten Controller zu speichern

Bitte beziehen Sie sich auf meine Antwort auf die Frage zum benutzerdefinierten Umfang:

Frühlings-MVC-Custom-Bean

Das einzige, was in diesem Code fehlt, ist die folgende XML-Konfiguration:

<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

Ich benutze Feder 3.2.3 und hier habe ich ein ähnliches Problem gelöst.
1) RedirectAttributes redirectAttributes wurde der Methodenparameterliste in Controller 1 hinzugefügt.

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

2) In der Methode wurde Code zum Hinzufügen von Flash-Attributen zu redirectAttributes redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject); hinzugefügt.

3) Dann verwenden Sie im zweiten Controller den mit @ModelAttribute kommentierten Methodenparameter, um auf die Umleitungsattribute zuzugreifen

@ModelAttribute("mapping1Form") final Object mapping1FormObject

Hier ist der Beispielcode von Controller 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";
}   

Ab 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

Die Verwendung von nur redirectAttributes.addFlashAttribute(...) -> "redirect:..." hat auch funktioniert, das Modellattribut musste nicht "neu eingefügt" werden.

Vielen Dank, aborskiy!

11
pkopac

Sie können das Problem mithilfe von org.springframework.web.servlet.mvc.support.RedirectAttributes beheben.

Hier ist mein Controller-Beispiel.

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

lesen Sie mehr in meinem Blog unter http://mayurshah.in/596/how-do-i-redirect-to-page-keeping-model-value

3
Mayur Shah

Ich habe @ControllerAdvice verwendet, bitte prüfen, ob in Spring 3.X verfügbar ist; Ich verwende es im Frühjahr 4.0.

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

    @ModelAttribute("userList")
    public List<User> getUsersList()
    {
       //some code
       return ...
    }
}
0
JPRLCol

Wenn Sie alle Attribute übergeben möchten, um sie weiterzuleiten ...

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

Ich hatte das gleiche Problem. 

Mit RedirectAttributes nach der Aktualisierung der Seite sind meine Modellattribute vom ersten Controller verloren gegangen. Ich dachte, das ist ein Fehler, aber dann habe ich eine Lösung gefunden ... Im ersten Controller füge ich Attribute in ModelMap hinzu und mache dies anstelle von "Weiterleiten":

return " vorwärts :/nameOfView";

Dadurch werden Sie zu Ihrem anderen Controller umgeleitet und die Modellattribute bleiben dabei erhalten.

Ich hoffe, das ist was Sie suchen. Entschuldigung für mein Englisch

0
DinkoCejvanovic

Fügen Sie der Umleitungs-URL alle Modellattribute als Abfragezeichenfolge hinzu.

0
Pokuri

Mit @ModelAttribute können wir das Modell von einem Controller an einen anderen Controller übergeben.

[Eingang zum ersten Controller] [1]

[]: https://i.stack.imgur.com/rZQe5.jpg Von der jsp-Seite bindet der erste Controller die Formulardaten mit dem @ModelAttribute an das 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;
        }
    }
0
john kothapeta

Vielleicht könntest du es so machen:

Verwenden Sie das Modell nicht im ersten Controller. Speichern Sie Daten in einem anderen gemeinsam genutzten Objekt, das dann vom zweiten Controller abgerufen werden kann.

Schau dir das und das an. Es geht um das ähnliche Problem.

P.S.

Sie könnten wahrscheinlich session scoped bean für diese gemeinsam genutzten Daten verwenden ... 

0
Matjaz Muhic