[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.면책 조항 : 저는 여전히 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.나는 최근에이 문제를 만났고, 더 쉬운 방법을 발견했다. (아마 Spring 3의 지원이다.)
나는 최근에이 문제를 만났고, 더 쉬운 방법을 발견했다. (아마 Spring 3의 지원이다.)
List<FieldError> errors = bindingResult.getFieldErrors(); for (FieldError error : errors ) { System.out.println (error.getObjectName() + " - " + error.getDefaultMessage()); }
메시지 소스를 변경하거나 추가 할 필요가 없습니다.
-
==============================
3.자바 8 스트림
자바 8 스트림
bindingResult .getFieldErrors() .stream() .forEach(f -> System.out.println(f.getField() + ": " + f.getDefaultMessage()));
-
==============================
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.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 />"); }
from https://stackoverflow.com/questions/2751603/how-to-get-error-text-in-controller-from-bindingresult by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 다중 데이터베이스 스키마를 사용하는 JPA (0) | 2018.12.19 |
---|---|
[SPRING] 스프링 데이터 저장소에서 Spring의 선언적 캐싱 지원을 테스트하는 방법은 무엇입니까? (0) | 2018.12.19 |
[SPRING] Spring XML 설정에서 주어진 타입의 모든 빈을 수집하고 삽입하는 법 (0) | 2018.12.19 |
[SPRING] 스프링 배치 원격 청킹과 원격 파티셔닝의 차이점 (0) | 2018.12.19 |
[SPRING] HTTP 응답이 아닌 서버 응답을 기반으로 jquery.ajax () 오류 콜백을 트리거하는 방법은 무엇입니까? (0) | 2018.12.19 |