[SPRING] 스프링 3이 작동하지 않습니다 @ json 요청시 400 오류 요청 오류가 발생했습니다.
SPRING스프링 3이 작동하지 않습니다 @ json 요청시 400 오류 요청 오류가 발생했습니다.
Spring3 프레임 워크, 최대 절전 유효성 검사기 및 잭슨 사용하고 있습니다.
내가 jsondata를 서버에 요청할 때. 400 개의 잘못된 요청 오류가 반환되었습니다.
내 데이터가 일치하지 않는 유형입니다.
검색 유형을 요청하면 잘 작동합니다.
내 컨트롤러 코드 :
@RequestMapping(consumes = MediaType.ALL_VALUE, produces = MediaType.ALL_VALUE,value =
"doAdd", method = RequestMethod.POST)
@ResponseBody
public Customer doAdd(@RequestBody @Valid Customer inData){
this.customerService.addData(inData);
return inData;
}
오류 처리 방법은 다음과 같습니다.
@ExceptionHandler
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ResponseBody
public void ajaxValidationErrorHandle(MethodArgumentNotValidException errors ,
HttpServletResponse response) throws BusinessException {
List<String> resErrors = new ArrayList<String>();
for(ObjectError error : errors.getBindingResult().getAllErrors()){
resErrors.add(error.getCode());
}
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
throw new BusinessException("E000001", "VALIDATION");
}
Customer.java (모델) :
package test.business.model;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Range;
public class Customer {
@Size(min = 0, max = 3)
public String id;
@NotNull
@Size(min = 1)
public String name;
@NotNull
@Range(min = 10, max = 99)
public Integer age;
public String updateTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
}
json 데이터 :
1.{"name":"ken","age":11,"updateTime":"2013-06-18"}
2.{"name":"ken","age":"","updateTime":""}
3.{"name":"ken","age":"joe","updateTime":""}
json 데이터 1이 정상적으로 반환됩니다.
json 데이터 2가 정상적으로 반환됩니다 (MethodArgumentNotValidException customer.age, NotNull을 포착했습니다).
json 데이터 2가 반환됩니다. 400 잘못된 요청 오류입니다. 하지만 Server가 typeMismatch.int 오류를 반환했기를 바랍니다.
@Pavel Horal 정말 고맙습니다!
나는 HttpMessageNotReadableException을 잡아서 처리 할 수있다.
오류가 변경된 메서드를 처리합니다.
@ExceptionHandler
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ResponseBody
public void ajaxValidationErrorHandle(Exception errors , HttpServletResponse response) throws BusinessException {
if(errors instanceof MethodArgumentNotValidException){
MethodArgumentNotValidException mane = (MethodArgumentNotValidException)errors;
for(ObjectError error : mane.getBindingResult().getAllErrors()){
resErrors.add(error.getCode());
}
}
if(errors instanceof HttpMessageNotReadableException){
JsonMappingException jme = (JsonMappingException)errors.getCause();
List<Reference> errorObj = jme.getPath();
for(Reference r : errorObj){
System.out.println(r.getFieldName());
}
}
・・・
그러나 기본 클래스를 만들거나 모든 컨트롤러에서이 코드를 작성하는 것이 상속됩니다. 스프링의 디자인 개념을 보지 못했기 때문에 ExceptionResolver를 새로 작성하기로 결정했습니다.
내 새로운 ExceptionResolver는 다음과 같습니다.
public class OriginalExceptionHandler extends SimpleMappingExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
ModelAndView m = null;
StringBuilder exceptionMessage = new StringBuilder(ajaxDefaultErrorMessage) ;
if(e instanceof BusinessException){
・・・
}else if(e instanceof HttpMessageNotReadableException){
Throwable t = e.getCause();
if(t instanceof JsonMappingException){
JsonMappingException jme = (JsonMappingException)t;
List<Reference> errorObj = jme.getPath();
for(Reference r : errorObj){
exceptionMessage.append("VE9999:Unmatched Type Error!!("+r.getFieldName()+")");
}
}else{
exceptionMessage.append(e+"\n"+o.toString());
}
}else if(e instanceof MethodArgumentNotValidException){
MethodArgumentNotValidException mane = (MethodArgumentNotValidException)e;
for(ObjectError error : mane.getBindingResult().getAllErrors()){
if(error instanceof FieldError){
FieldError fe = (FieldError) error;
exceptionMessage.append("VE0001:Validation Error!!"+fe.getField()+"-"+fe.getDefaultMessage());
}else{
exceptionMessage.append("VE0001:Validation Error!!"+error.getDefaultMessage());
}
}
}else{
・・・
그리고 application-context.xml에 향을 추가했습니다.
<bean class="test.core.OriginalExceptionHandler" p:order="1">
<property name="exceptionMappings">
<props>
<prop key="sample.core.BusinessException">
ExceptionPage
</prop>
<prop key="test.core.LoginSessionException">
LoginSessionException
</prop>
</props>
</property>
<property name="defaultErrorView" value="error" />
</bean>
이 사고 방식이 맞습니까?
고맙습니다,
해결법
-
==============================
1.데이터 바인딩 (객체에 대한 매핑 요청)은 데이터 유효성 검사의 독립적 인 프로세스입니다. Spring에서 데이터 바인딩은 전체 유효성 검증 오류에 대한 자체 바인딩 오류로 인해 기여할 수 있습니다.
데이터 바인딩 (객체에 대한 매핑 요청)은 데이터 유효성 검사의 독립적 인 프로세스입니다. Spring에서 데이터 바인딩은 전체 유효성 검증 오류에 대한 자체 바인딩 오류로 인해 기여할 수 있습니다.
바인딩 오류는 Spring의 표준 WebDataBinder에서 지원됩니다.이 WebDataBinder는 method 매개 변수가 @ModelAttribute로 주석을 달았을 때 시작됩니다.
@RequestBody 주석을 사용하면 완전히 다른 메커니즘이 사용됩니다. HttpMessageConverters (아마도 MappingJackson2HttpMessageConverter). JSON 비 정렬 화가 실패하면 HttpMessageNotReadableException 예외가 발생합니다.
핸들러 자체 또는 전역 @ControllerAdvice 내에서 전역 HandlerExceptionResolver 또는 예외적 인 @ExceptionHandler 어노테이션 처리기 메소드 내에서 예외를 처리 할 수 있습니다.
from https://stackoverflow.com/questions/17183102/spring3-doesnt-work-valid-when-json-request-i-got-400-bad-request-error by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] ModelMapper : 메서드에 매개 변수가없고 void를 반환하지 않도록합니다. (0) | 2019.05.22 |
---|---|
[SPRING] 아파치 프록시 뒤에 톰캣이 내장 된 스프링 부트 (0) | 2019.05.22 |
[SPRING] 1.8.6 : CronTriggerBean 클래스에 setCronExpression 메서드가 노출되지 않음 (0) | 2019.05.22 |
[SPRING] RestTemplate - 기본 타임 아웃 값 (0) | 2019.05.22 |
[SPRING] 응용 프로그램 간 Spring Cloud Config Server 공유 등록 정보 (0) | 2019.05.22 |