복붙노트

[SPRING] RedirectionAttributes를 통해 BindingResult 전달하기

SPRING

RedirectionAttributes를 통해 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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

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

    나는 다른 누군가가 더 나은 대답을 찾길 바랍니다.

  5. from https://stackoverflow.com/questions/15903238/passing-bindingresult-through-redirectionattributes by cc-by-sa and MIT license