복붙노트

[SPRING] 컨트롤러에서 BindingResult에서 오류 텍스트를 가져 오는 방법

SPRING

컨트롤러에서 BindingResult에서 오류 텍스트를 가져 오는 방법

JSON을 반환하는 컨트롤러가 있습니다. 스프링 주석을 통해 자체를 검증하는 형식을 취합니다. BindingResult에서 FieldError 목록을 가져올 수 있지만 JSP에 태그에 표시 할 텍스트는 포함하지 않습니다. JSON에서 다시 전송할 오류 텍스트는 어떻게 얻을 수 있습니까?

@RequestMapping(method = RequestMethod.POST)
public
@ResponseBody
JSONResponse submit(@Valid AnswerForm answerForm, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response) {

    if (result.hasErrors()) {
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        JSONResponse r = new JSONResponse();
        r.setStatus(JSONResponseStatus.ERROR);
        //HOW DO I GET ERROR MESSAGES OUT OF BindingResult??? 
    } else {
        JSONResponse r = new JSONResponse();
        r.setStatus(JSONResponseStatus.OK);
        return r;
    }

}

JSONREsponse 클래스는 단지 POJO입니다.

public class JSONResponse implements Serializable {
    private JSONResponseStatus status;
    private String error;
    private Map<String,String> errors;
    private Map<String,Object> data;

...getters and setters...
}

BindingResult.getAllErrors ()를 호출하면 FieldError 객체의 배열이 반환되지만 실제 오류는 발생하지 않습니다.

해결법

  1. ==============================

    1.면책 조항 : 저는 여전히 Spring-MVC 3.0을 사용하지 않습니다.

    면책 조항 : 저는 여전히 Spring-MVC 3.0을 사용하지 않습니다.

    하지만 Spring 2.5에서 사용 된 동일한 접근 방식이 여러분의 요구를 충족시킬 수 있다고 생각합니다.

    for (Object object : bindingResult.getAllErrors()) {
        if(object instanceof FieldError) {
            FieldError fieldError = (FieldError) object;
    
            System.out.println(fieldError.getCode());
        }
    
        if(object instanceof ObjectError) {
            ObjectError objectError = (ObjectError) object;
    
            System.out.println(objectError.getCode());
        }
    }
    

    나는 그것이 당신에게 유용 할 수 있기를 바랍니다.

    최신 정보

    리소스 번들에서 제공하는 메시지를 가져 오려면 등록 된 messageSource 인스턴스가 필요합니다 (messageSource라고해야 함)

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames" value="ValidationMessages"/>
    </bean>
    

    보기 내에 MessageSource 인스턴스 삽입

    @Autowired
    private MessageSource messageSource;
    

    그리고 당신의 메시지를 얻으려면 다음과 같이하십시오.

    for (Object object : bindingResult.getAllErrors()) {
        if(object instanceof FieldError) {
            FieldError fieldError = (FieldError) object;
    
            /**
              * Use null as second parameter if you do not use i18n (internationalization)
              */
    
            String message = messageSource.getMessage(fieldError, null);
        }
    }
    

    검사기는 다음과 같아야합니다.

    /**
      * Use null as fourth parameter if you do not want a default message
      */
    errors.rejectValue("<FIELD_NAME_GOES_HERE>", "answerform.questionId.invalid", new Object [] {"123"}, null);
    
  2. ==============================

    2.나는 최근에이 문제를 만났고, 더 쉬운 방법을 발견했다. (아마 Spring 3의 지원이다.)

    나는 최근에이 문제를 만났고, 더 쉬운 방법을 발견했다. (아마 Spring 3의 지원이다.)

        List<FieldError> errors = bindingResult.getFieldErrors();
        for (FieldError error : errors ) {
            System.out.println (error.getObjectName() + " - " + error.getDefaultMessage());
        }
    

    메시지 소스를 변경하거나 추가 할 필요가 없습니다.

  3. ==============================

    3.자바 8 스트림

    자바 8 스트림

    bindingResult
    .getFieldErrors()
    .stream()
    .forEach(f -> System.out.println(f.getField() + ": " + f.getDefaultMessage()));
    
  4. ==============================

    4.벤 CML :

    벤 CML :

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>messages</value>
            </list>            
        </property>
    </bean>
    
    <bean id="messageAccessor" class="org.springframework.context.support.MessageSourceAccessor">
        <constructor-arg index="0" ref="messageSource"/>
    </bean> 
    

    자바:

    for (FieldError error : errors.getFieldErrors()) {
        logger.debug(messageAccessor.getMessage(error));
    }
    

    참고 : Errors.getDefaultMessage ()를 호출해도 코드 + args에서 생성 된 것과 동일한 메시지가 반환되지는 않습니다. defaultMessage는 Errors.rejectValue () 메서드를 호출 할 때 정의 된 별도의 값입니다. Errors.rejectValue () API를 참조하십시오.

  5. ==============================

    5.WebMvcConfigurerAdapter :

    WebMvcConfigurerAdapter :

    @Bean(name = "messageSourceAccessor")
    public org.springframework.context.support.MessageSourceAccessor messageSourceAccessor() {
        return new MessageSourceAccessor( messageSource());
    }
    

    제어 장치:

    @Autowired
    @Qualifier("messageSourceAccessor")
    private MessageSourceAccessor           messageSourceAccessor;
    ...
    
    StringBuilder sb = new StringBuilder();
    for (ObjectError error : result.getAllErrors()) {
        if ( error instanceof FieldError) {
            FieldError fe = (FieldError) error;
            sb.append( fe.getField());
            sb.append( ": ");
        }
        sb.append( messageSourceAccessor.getMessage( error));
        sb.append( "<br />");
    }
    
  6. from https://stackoverflow.com/questions/2751603/how-to-get-error-text-in-controller-from-bindingresult by cc-by-sa and MIT license