Spring3 не работает @valid, когда запрос json Я получил 400 Ошибка Bad Request

используя среду Spring3, валидатор гибернации и Джексона.

когда я запрашиваю jsondata на сервер. вернул ошибку 400 Bad Request.

тогда мои данные не соответствуют типу.

когда я запрашиваю тип соответствия, тоработает хорошо.

Код моего контроллера:

@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 resErrors = new ArrayList();
    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 data 2 возвращается 400 Ошибка Bad Request. но я надеюсь, что сервер вернул ошибку 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 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 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:

    
    
        
            
                ExceptionPage
            
            
                LoginSessionException
            
        
    
    

Этот способ мышления правильный?

Спасибо,

 user249943619 июн. 2013 г., 07:04
извините, я обновился.
 Ryan Stewart19 июн. 2013 г., 06:55
Ни один из ,{"ken","11","2013-06-18"}{"ken","",""}, или же{"ken","joe",""} являются JSON.

Ответы на вопрос(1)

Привязка данных (запрос на сопоставление с объектами) является независимым процессом от проверки данных. В Spring привязка данных может вносить свои собственные ошибки привязки в общие ошибки валидации.

Ошибки привязки поддерживаются Spring 'стандартWebDataBinder, который срабатывает, когда параметр метода аннотируется@ModelAttribute

С@RequestBody аннотации используется совершенно другой механизм -HttpMessageConverters (в вашем случае, вероятно,MappingJackson2HttpMessageConverter). Когда JSON unmarshalling не удаетсяHttpMessageNotReadableException исключение брошено.

Вы можете обрабатывать исключения в вашем глобальномHandlerExceptionResolver или специальный@ExceptionHandler аннотированный метод обработчика в самом обработчике или глобальном.@ControllerAdvice

Ваш ответ на вопрос