2013-04-09 16 views
9

Sono bloccato cercando di passare il BindingResult attraverso RedirectionAttributes:Passando attraverso BindingResult RedirectionAttributes

ho fatto riferimento Spring - Redirect after POST (even with validation errors), ma sono ancora bloccati.

Ho un metodo GET:

@RequestMapping(value = "/test", method = RequestMethod.GET) 
public String test(@ModelAttribute("exampleForm") final ExampleForm exampleForm, final Model model) 
{ 
    return "test"; 
} 

e un metodo POST:

@RequestMapping(value = "/doSomething", method = RequestMethod.POST) 
public String doSomething(@Valid @ModelAttribute("exampleForm") final ExampleForm exampleForm, final BindingResult bindingResult, final RedirectAttributes redirectAttributes) 
{ 
    if (bindingResult.hasErrors()) 
    { 
     redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.exampleForm", bindingResult); 
     redirectAttributes.addFlashAttribute("exampleForm", exampleForm); 
     return "redirect:/test"; 
    } 
} 

Tuttavia, non sto vedendo gli errori vincolanti nel modello del metodo GET (dopo il reindirizzamento), quando ho riceverli nel metodo POST - sembrano scomparire.

Ecco l'oggetto bindingResult nel metodo POST: org.springframework.validation.BeanPropertyBindingResult: 1 errors

Qui è l'ingresso del modello nel metodo GET mostrando 0 errori: org.springframework.validation.BindingResult.exampleForm=org.springframework.validation.BeanPropertyBindingResult: 0 errors

Qualsiasi aiuto sarebbe molto apprezzato.

+0

Possibile duplicato di [Spring - Redirect dopo POST (anche con errori di validazione)] (http://stackoverflow.com/questions/2543797/spring-redirect-after-post-even-with-validation-errors) – Eric

risposta

3

Un altro approccio che può risolvere il problema. attributi della sessione aiutano a persistere oggetti tra le richieste, in modo che il successivo in base su di esso

@Controller 
@SessionAttributes(
{ "exampleForm" }) 
public class HomeController 
{ 

@ModelAttribute("exampleForm") 
public ExampleForm getExampleForm() 
{ 
    return new ExampleForm(); 
} 

@RequestMapping(value = "/myform", method = RequestMethod.POST) 
public String proccessForm(@Valid @ModelAttribute("exampleForm") 
     final ExampleForm form, final BindingResult result, 
     final SessionStatus sessionStatus) 
{ 
    if (result.hasErrors()) 
    { 
     return "redirect:/myform"; 
    } 
    sessionStatus.setComplete(); 
    return "redirect:/complete"; 
} 

@RequestMapping(value = "/myform", method = RequestMethod.GET) 
public String showForm(final Model model) 
{ 
    return "form"; 
} 

@RequestMapping(value = "/complete", method = RequestMethod.GET) 
public String showSomething(final Model model) 
{ 
    return "complete"; 
} 
} 
2

Questa non è affatto una buona risposta, ma un work-around:

ho dovuto impostare il flashAttribute a "exampleFormBindingResult", quindi sovrascrivere il modello "org.springframework.validation.BindingResult.exampleForm" attributo

@RequestMapping(value = "/test", method = RequestMethod.GET) 
public String test(@ModelAttribute("exampleForm") final ExampleForm exampleForm, final Model model) 
{ 
    if (model.asMap().containsKey("exampleFormBindingResult")) 
    { 
     model.addAttribute("org.springframework.validation.BindingResult.exampleForm", 
       model.asMap().get("exampleFormBindingResult")); 
    } 

    return "test"; 
} 

ho aggiunto un flashAttribute con il tasto "exampleFormBindingResult":

@RequestMapping(value = "/doSomething", method = RequestMethod.POST) 
public String doSomething(@Valid @ModelAttribute("exampleForm") final ExampleForm exampleForm, final BindingResult bindingResult, final RedirectAttributes redirectAttributes) 
{ 
    if (bindingResult.hasErrors()) 
    { 
     redirectAttributes.addFlashAttribute("exampleFormBindingResult", bindingResult); 
     redirectAttributes.addFlashAttribute("exampleForm", exampleForm); 
     return "redirect:/test"; 
    } 
} 

Spero che qualcun altro trova una risposta migliore.

+2

come hai detto tu è un buon lavoro, hai trovato una risposta migliore? Non riesco ancora a capire perché BindingResult viene annullato quando si verifica il reindirizzamento (mostrando 0 errori). – dacuna

9

Questo è simile alla risposta di Cyril Deba, ma si può fare con flash attributi piuttosto che @SessionAttributes. La chiave è che sembra che se si metta @ModelAttribute per rendere il modulo nel metodo GET RequestMapping, non mantenga i dati dagli attributi flash di reindirizzamento, ma se si rende il nuovo oggetto modulo da inserire nel modello come il suo metodo, quindi lo usa solo se il modello non lo contiene già. ma non ho trovato la documentazione dalla primavera che dice che funziona in questo modo, o perché sembrano funzionare diversa, ma qualcosa di simile le seguenti opere:

@Controller 
public class MyFormController { 

    @ModelAttribute("myForm") 
    public MyForm newMyForm() { 
     return new MyForm(); 
    } 

    @RequestMapping(value = "/myForm/", method = RequestMethod.GET) 
    public String showMyForm() { 
     return "myForm"; 
    } 

    @RequestMapping(value = "/myForm/", method = RequestMethod.POST) 
    public String processMyForm(
      @Valid @ModelAttribute("myForm") final MyForm myForm, 
      final BindingResult bindingResult, 
      final RedirectAttributes redirectAttributes) { 
     final String view; 
     if (bindingResult.hasErrors()) { 
      redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.myForm", bindingResult); 
      redirectAttributes.addFlashAttribute("myForm", myForm); 
      view = "redirect:/myForm/"; 
     } else { 
      // Success 
      view = "redirect:/"; 
     } 
     return view; 
    } 
} 
3

tuo metodo GET vorrei

@RequestMapping(value = "/test", method = RequestMethod.GET) 
public String test(final Model model) 
{ 
    if(!model.containsAttribute("exampleForm")){ 
     model.addAttribute("exampleForm", new ExampleForm()); 
    } 
    return "test"; 
} 
Problemi correlati