아래는 내가하고 싶은 것이지만, "create"return을 사용할 때만 유효성 검사 오류를 볼 수 있습니다.
-
==============================
1.Spring 3.1부터 RedirectAttributes를 사용할 수있다. 리디렉션을 수행하기 전에 사용 가능하게 할 속성을 추가하십시오. 유효성을 검사하는 데 사용하는 BindingResult 및 개체 (이 경우 Register)를 모두 추가하십시오.
Spring 3.1부터 RedirectAttributes를 사용할 수있다. 리디렉션을 수행하기 전에 사용 가능하게 할 속성을 추가하십시오. 유효성을 검사하는 데 사용하는 BindingResult 및 개체 (이 경우 Register)를 모두 추가하십시오.
BindingResult의 경우 "org.springframework.validation.BindingResult. [name of your ModelAttribute]"라는 이름을 사용합니다.
유효성을 검사하는 데 사용하는 개체의 경우 ModelAttribute라는 이름을 사용합니다.
RedirectAttributes를 사용하려면 설정 파일에 추가해야합니다. 다른 것들 중에는 몇 가지 새로운 클래스를 사용하도록 Spring에 알려주는 경우가 있습니다.
<mvc:annotation-driven />
이제 리디렉션 할 때마다 오류가 표시됩니다.
@RequestMapping(value = "/submit", method = RequestMethod.POST)
public final String submit(@ModelAttribute("register") @Valid final Register register, final BindingResult binding, RedirectAttributes attr, HttpSession session) {
if (binding.hasErrors()) {
attr.addFlashAttribute("org.springframework.validation.BindingResult.register", binding);
attr.addFlashAttribute("register", register);
return "redirect:/register/create";
}
return "redirect:/register/success";
}
-
==============================
2.Oscar의 멋진 답변 외에도 RedirectAttributes 접근 방식을 따르고 있다면 실제로 modelAttribute를 리디렉션 된 페이지로 전달한다는 사실을 잊지 마십시오. 즉, 컨트롤러에서 리디렉션 된 페이지에 대한 해당 modelAttribute의 새 인스턴스를 만드는 경우 유효성 검사 오류가 손실됩니다. 그래서 POST 컨트롤러 메소드가 다음과 같은 경우 :
Oscar의 멋진 답변 외에도 RedirectAttributes 접근 방식을 따르고 있다면 실제로 modelAttribute를 리디렉션 된 페이지로 전달한다는 사실을 잊지 마십시오. 즉, 컨트롤러에서 리디렉션 된 페이지에 대한 해당 modelAttribute의 새 인스턴스를 만드는 경우 유효성 검사 오류가 손실됩니다. 그래서 POST 컨트롤러 메소드가 다음과 같은 경우 :
@RequestMapping(value = "/submit", method = RequestMethod.POST)
public final String submit(@ModelAttribute("register") @Valid final Register register, final BindingResult binding, RedirectAttributes attr, HttpSession session) {
if (binding.hasErrors()) {
attr.addFlashAttribute("org.springframework.validation.BindingResult.register", binding);
attr.addFlashAttribute("register", register);
return "redirect:/register/create";
}
return "redirect:/register/success";
}
그런 다음 등록 페이지 생성 GET 컨트롤러에서 수정해야 할 것입니다. 이것으로부터:
@RequestMapping(value = "/register/create", method = RequestMethod.GET)
public String registerCreatePage(Model model) {
// some stuff
model.addAttribute("register", new Register());
// some more stuff
}
에
@RequestMapping(value = "/register/create", method = RequestMethod.GET)
public String registerCreatePage(Model model) {
// some stuff
if (!model.containsAttribute("register")) {
model.addAttribute("register", new Register());
}
// some more stuff
}
출처 : http://gerrydevstory.com/2013/07/11/preserving-validation-error-messages-on-spring-mvc-form-post-redirect-get/
-
==============================
3.문제는 뷰를 렌더링하고 처리 된 폼 페이지를 반환하는 대신 새 컨트롤러로 리디렉션하는 것입니다. 다음 행을 따라 뭔가를해야합니다.
문제는 뷰를 렌더링하고 처리 된 폼 페이지를 반환하는 대신 새 컨트롤러로 리디렉션하는 것입니다. 다음 행을 따라 뭔가를해야합니다.
String FORM_VIEW = wherever_your_form_page_resides
...
if (binding.hasErrors())
return FORM_VIEW;
문자열의 코드 중복으로 인해 메서드 외부에 경로를 유지합니다.
-
==============================
4.요청간에 객체를 지속시키는 유일한 방법 (즉, 리디렉션)은 객체를 세션 속성에 저장하는 것입니다. 따라서 두 메소드 (get 및 post)의 메소드 매개 변수에 "HttpServletRequest request"를 포함시키고 request.getAttribute ( "binding")를 통해 객체를 검색합니다. 즉, 직접 시도하지 않고 새 요청에서 바인딩을 개체에 다시 바인딩하는 방법을 찾아야 할 수도 있습니다.
요청간에 객체를 지속시키는 유일한 방법 (즉, 리디렉션)은 객체를 세션 속성에 저장하는 것입니다. 따라서 두 메소드 (get 및 post)의 메소드 매개 변수에 "HttpServletRequest request"를 포함시키고 request.getAttribute ( "binding")를 통해 객체를 검색합니다. 즉, 직접 시도하지 않고 새 요청에서 바인딩을 개체에 다시 바인딩하는 방법을 찾아야 할 수도 있습니다.
또 다른 "좋지 않은"방법은 javascript를 사용하여 브라우저 URL을 변경하는 것입니다.
-
==============================
5.왜 리디렉션이 필요한지 질문 할 것입니다. 왜 똑같은 URL에 제출하고 POST와 다르게 반응하지 않는가? 그럼에도 불구하고 정말로 이것을하고 싶다면 :
왜 리디렉션이 필요한지 질문 할 것입니다. 왜 똑같은 URL에 제출하고 POST와 다르게 반응하지 않는가? 그럼에도 불구하고 정말로 이것을하고 싶다면 :
@RequestMapping(value = "/submit", method = RequestMethod.POST)
public final String submit(
@ModelAttribute("register") @Valid final Register register,
final BindingResult binding,
HttpSession session) {
if (binding.hasErrors()) {
session.setAttribute("register",register);
session.setAttribute("binding",binding);
return "redirect:/register/create";
}
return "redirect:/register/success";
}
그런 다음 "만들기"방법 :
model.put("register",session.getAttribute("register"));
model.put("org.springframework.validation.BindingResult.register",session.getAttribute("register"));
-
==============================
6.Google App Engine의 정확한 문제를 알지 못하지만 ForwardedHeaderFilter를 사용하면 클라이언트가 사용한 원래 구성표를 유지하는 데 도움이 될 수 있습니다. 이 필터는 Spring Framework 4.3에서 추가되었지만 일부 서블릿 컨테이너는 유사한 필터를 제공하며 필터는 자동으로 필요하므로 필요할 경우 소스를 가져올 수 있습니다.
Google App Engine의 정확한 문제를 알지 못하지만 ForwardedHeaderFilter를 사용하면 클라이언트가 사용한 원래 구성표를 유지하는 데 도움이 될 수 있습니다. 이 필터는 Spring Framework 4.3에서 추가되었지만 일부 서블릿 컨테이너는 유사한 필터를 제공하며 필터는 자동으로 필요하므로 필요할 경우 소스를 가져올 수 있습니다.
-
==============================
7.아마도 이것은 조금 단순하지만, 모델에 추가하려고 했습니까? 즉, 메서드의 인수에 Model을 포함시킨 다음 BindingResult를 추가하면 해당 뷰에서 사용할 수 있습니다.
아마도 이것은 조금 단순하지만, 모델에 추가하려고 했습니까? 즉, 메서드의 인수에 Model을 포함시킨 다음 BindingResult를 추가하면 해당 뷰에서 사용할 수 있습니다.
model.addAttribute("binding",binding);
리다이렉트보다는 포워드를 사용해야 할 것 같아요. (리디렉션이 세션을 잃어 버렸는지 기억이 안나네요 .- 문서가 없기 때문에 잘못 될 수 있습니다. if BindingResult를 Model에 추가 한 후에 BindingResult를 얻지 못하면 대신이를 사용하여 전달을 확인하십시오.
from https://stackoverflow.com/questions/2543797/spring-redirect-after-post-even-with-validation-errors by cc-by-sa and MIT license