当前位置: 首页 > 知识库问答 >
问题:

Spring3不工作@valid当json请求时我得到了400个错误请求

常彭薄
2023-03-14
@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":""}

我可以捕获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());
        }
    }
・・・

但是,继承来创建基类或在所有控制器中编写这段代码感觉我没有看到spring的设计概念,因为它决定在那里处理以创建一个新的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{
                 ・・・
    <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个答案

解阳荣
2023-03-14

数据绑定(将请求映射到对象)是一个独立于数据验证的过程。在Spring中,数据绑定可能会因其自身的绑定错误而导致总体验证错误。

Spring的标准WebDataBinder支持绑定错误,当使用@ModelAttribute注释方法参数时,就会出现绑定错误

对于@RequestBody注释,使用了一种完全不同的机制--HttpMessageConverter(在您的例子中,可能是MappingJackson2HttpMessageConverter)。当JSON解组失败时,将引发HttpMessageNotreadableException异常。

 类似资料:
  • 问题内容: 验证表单时,我的行为很奇怪。 一旦添加了Hibernate @Valid批注,如果发布的数据无效,Tomcat会将我的请求视为“错误”。如果数据有效,则无后顾之忧。 我用: Tomcat 7.0.52 Javax验证API 1.1.0.Final Hibernate Validator 5.1.0.Final Spring 4.0.3发布 目前,我做了一个非常简单的验证: Spring

  • 所以我已经研究了好几个小时,尝试了不同的东西,研究了好几个小时都没有结果。调用是在提供user和pass之后获取JWT令牌。 当它到达服务器时,morgan看到有一个请求,但我得到的状态是400。这是我的路线 我很难理解护照是怎么回事。authenticate('localAuth')起作用,因此这是我的策略文件,以备需要 更新:我在检查fiddler上的请求时遇到了某种错误。 ~标题~:132

  • 我正在使用Basecamp API,它是一个REST(JSON)API,使用HTTPS上的基本HTTP身份验证。 这应该是一个GET请求,但当我使用GET运行我的代码时,我收到了: 无法发送包含此谓词类型的内容正文 当我将其作为POST运行时,我会收到: {“状态”:“400”,“错误”:“错误的请求”} 有谁知道为什么会发生这种情况? 在此代码中,我显然交换了用户名,密码,项目名称和URL,但在

  • 我已将Nginx反向代理服务器配置为侦听端口443,并将请求传递给上游SAAS客户端。以下是配置。 这里的SSL证书还包括用于与上游服务器进行SSL握手的中间证书。现在当我尝试访问https://test.saas.someloggingserver.com从IE(配置了以上代理)中,我得到了低于400的错误请求错误。我不是Nginx调试专家,如果你能看看下面的日志并告诉我这个问题的可能原因,我将

  • 我有一个基于Spring Web model view controller(MVC)框架的项目。Spring Web模型-视图-控制器(MVC)框架的版本是3.2.8 我有这个控制器 这个URL一切正常:

  • 目前从Angular JS controller中,我试图将JSON数据发送到后端服务。但是我有400个错误的请求错误。 在Controller中,我试图通过http服务发送数据,如下所示: