[SPRING] RedirectionAttributes를 통해 BindingResult 전달하기
SPRINGRedirectionAttributes를 통해 BindingResult 전달하기
리디렉션 특성을 통해 BindingResult를 전달하려고 시도했습니다.
나는 POST 이후에 Spring - Redirect를 참조했지만 (여전히 유효성 검사 오류로), 여전히 고착되어있다.
나는 GET 방법을 가지고있다 :
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test(@ModelAttribute("exampleForm") final ExampleForm exampleForm, final Model model)
{
return "test";
}
및 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";
}
}
그러나 POST 메서드에서 수신 할 때 GET 메서드 (리디렉션 후) 모델에서 바인딩 오류가 표시되지 않습니다. 사라지는 것처럼 보입니다.
다음은 POST 메서드의 bindingResult 객체입니다. org.springframework.validation.BeanPropertyBindingResult : 오류 1 개
다음은 오류가 0 인 GET 메소드의 모델 항목입니다. org.springframework.validation.BindingResult.exampleForm = org.springframework.validation.BeanPropertyBindingResult : 오류가 없습니다.
어떤 도움이라도 대단히 감사 할 것입니다.
해결법
-
==============================
1.문제를 해결할 수있는 방법이 하나 더 있습니다. 세션 속성은 요청간에 객체를 지속시키는 데 도움이되므로 다음을 기반으로합니다.
문제를 해결할 수있는 방법이 하나 더 있습니다. 세션 속성은 요청간에 객체를 지속시키는 데 도움이되므로 다음을 기반으로합니다.
@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.이것은 Cyril Deba의 답변과 비슷하지만 @SessionAttributes가 아닌 Flash 속성을 사용하여 수행 할 수 있습니다. 핵심은 GET RequestMapping 메서드에서 양식을 만들기 위해 @ModelAttribute를 넣었거나, 리디렉션 플래시 속성에서 데이터를 유지하지 않지만 새 양식 객체를 다음과 같이 모델에 삽입하는 것처럼 보이는 것입니다. 그 자체의 메소드 인 경우, 모델에 이미 포함되어 있지 않은 경우에만 사용됩니다. 나는 아직 Spring에서 문서를 찾지 못했다.이 문서는 이런 방식으로 작동하는지, 왜 다른 방식으로 작동 하는지를 보여주는데, 다음과 같은 일을한다.
이것은 Cyril Deba의 답변과 비슷하지만 @SessionAttributes가 아닌 Flash 속성을 사용하여 수행 할 수 있습니다. 핵심은 GET RequestMapping 메서드에서 양식을 만들기 위해 @ModelAttribute를 넣었거나, 리디렉션 플래시 속성에서 데이터를 유지하지 않지만 새 양식 객체를 다음과 같이 모델에 삽입하는 것처럼 보이는 것입니다. 그 자체의 메소드 인 경우, 모델에 이미 포함되어 있지 않은 경우에만 사용됩니다. 나는 아직 Spring에서 문서를 찾지 못했다.이 문서는 이런 방식으로 작동하는지, 왜 다른 방식으로 작동 하는지를 보여주는데, 다음과 같은 일을한다.
@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.귀하의 GET 방법이 좋아야합니다.
귀하의 GET 방법이 좋아야합니다.
@RequestMapping(value = "/test", method = RequestMethod.GET) public String test(final Model model) { if(!model.containsAttribute("exampleForm")){ model.addAttribute("exampleForm", new ExampleForm()); } return "test"; }
-
==============================
4.이것은 결코 좋은 대답은 아니지만 해결 방법입니다.
이것은 결코 좋은 대답은 아니지만 해결 방법입니다.
flashAttribute를 "exampleFormBindingResult"로 설정하고 모델 "org.springframework.validation.BindingResult.exampleForm"특성을 재정의해야했습니다.
@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"; }
"exampleFormBindingResult"키를 사용하여 flashAttribute를 추가했습니다.
@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"; } }
나는 다른 누군가가 더 나은 대답을 찾길 바랍니다.
from https://stackoverflow.com/questions/15903238/passing-bindingresult-through-redirectionattributes by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] XSS를 방지하기 위해 c : out을 사용하는 대신 (0) | 2019.03.16 |
---|---|
[SPRING] 봄 : 누락 된 JPA 메타 모델 (0) | 2019.03.16 |
[SPRING] Spring : @SessionAttributes 대 HttpSession (0) | 2019.03.16 |
[SPRING] Spring 3.1 사용자 정의 제약 조건 유효성 검사기에서 자동 와이어 링이 작동하지 않습니다. (0) | 2019.03.16 |
[SPRING] Spring 기반 Java 애플리케이션에서 단일 실행 가능 JAR 작성 (0) | 2019.03.16 |