2013-04-09 37 views
9

Tôi đang mắc kẹt cố gắng để vượt qua BindingResult qua RedirectionAttributes:Đi qua BindingResult qua RedirectionAttributes

Tôi đã tham chiếu Spring - Redirect after POST (even with validation errors), nhưng vẫn còn bị mắc kẹt.

Tôi có một phương thức GET:

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

và một phương thức 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"; 
    } 
} 

Tuy nhiên, tôi không nhìn thấy lỗi ràng buộc trong mô hình của phương thức GET (sau khi chuyển hướng) khi tôi nhận chúng trong phương thức POST - chúng dường như biến mất.

Đây là đối tượng bindingResult trong phương thức POST: org.springframework.validation.BeanPropertyBindingResult: 1 errors

Dưới đây là sự xâm nhập mô hình trong phương thức GET thấy 0 lỗi: org.springframework.validation.BindingResult.exampleForm=org.springframework.validation.BeanPropertyBindingResult: 0 errors

Bất kỳ trợ giúp sẽ được nhiều đánh giá cao.

+0

Có thể trùng lặp của [Mùa xuân - Chuyển hướng sau POST (ngay cả với lỗi xác thực)] (http://stackoverflow.com/questions/2543797/spring-redirect-after-post-even-with-validation-errors) – Eric

Trả lời

3

Một cách tiếp cận khác có thể giải quyết được vấn đề. thuộc tính phiên giúp persist các đối tượng giữa các yêu cầu, vì vậy sau đây dựa trên nó

@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

Đây là không phải là một câu trả lời tốt, nhưng một công việc xung quanh:

tôi phải thiết lập các flashAttribute để "exampleFormBindingResult", sau đó ghi đè lên các mô hình "org.springframework.validation.BindingResult.exampleForm" thuộc tính

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

tôi đã thêm một flashAttribute với một chìa khóa "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"; 
    } 
} 

tôi hy vọng ai đó tìm thấy một câu trả lời tốt hơn.

+2

như bạn đã nói điều này là một công việc tốt xung quanh, bạn đã tìm thấy một câu trả lời tốt hơn chưa? Tôi vẫn không thể tìm ra lý do tại sao BindingResult bị ghi đè khi chuyển hướng xảy ra (hiển thị 0 lỗi). – dacuna

9

này cũng tương tự như câu trả lời Cyril Deba, nhưng bạn có thể làm điều đó với các thuộc tính đèn flash chứ không phải @SessionAttributes. Điều quan trọng là có vẻ như nếu bạn đặt @ModelAttribute để tạo biểu mẫu trên phương thức GET RequestMapping, nó không giữ dữ liệu từ các thuộc tính flash chuyển hướng, nhưng nếu bạn làm cho đối tượng biểu mẫu mới đi vào mô hình phương pháp riêng của nó, sau đó nó chỉ sử dụng nó nếu mô hình không chứa nó. Tôi chưa đã không tìm thấy tài liệu từ mùa xuân nói rằng nó hoạt động theo cách này, hoặc tại sao họ có vẻ làm việc khác nhau, nhưng một cái gì đó giống như các công việc sau:

@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

phương thức GET của bạn nên thích

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