springboot 实现对请求参数的验证 和 全局异常捕获

 

要实现注解对参数的验证,需要先创建一个模型类 ,然后在控制器中获取参数并进行验证,具体步骤如下,

先要创建spring的工程,这部分先不讲了

现在pom.xml 中加入如下依赖:

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.3.4.Final</version>
</dependency>

建表语句如下:

CREATE TABLE `t_user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) DEFAULT NULL,
  `sex` tinyint(1) DEFAULT '1',
  `note` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4;

1、首先进行参数验证

package com.example.demo4.entity;


import org.hibernate.validator.constraints.NotBlank;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

@Valid
public class TUser {
    private Integer id;

    @NotBlank(message = "请输入用户名")
    @NotNull(message = "用户名不能为空")
    private String userName;

    @NotNull(message = "性别不能为空")
    private Integer sex;

    @NotNull(message = "备注不能为空")
    private String note;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }
}

2、控制器的编写

package com.example.demo4.controller;

import com.alibaba.fastjson.JSONObject;
import com.example.demo4.Tools.OkHttpRequest;
import com.example.demo4.entity.TUser;

import com.example.demo4.service.TUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.io.IOException;

@RestController
@RequestMapping("/tuser")
public class TUserController {

    @Autowired
    TUserService tUserService;
    
    @PostMapping("/converter")
    public TUser getuser(@RequestBody @Valid  TUser user) {
        return user;
    }
}

 

完成上述验证,会在控制台抛出异常,为了实现全局捕获异常,需要加入下面的代码

1、首先定义一个枚举类

package com.example.demo4.handler;

public interface BaseErrorInfoInterface {

    int getResultCode();

    String getResultMessage();

}

1、先定义一个枚举类

package com.example.demo4.enumion;

import com.example.demo4.handler.BaseErrorInfoInterface;

public enum CommonEnum implements BaseErrorInfoInterface {

    SUCCESS(200, "成功"),
    BODY_NOT_MATCH(400, "请求的数据格式不符"),
    SIGNAUTION_NOT_MATCH(401, "请求的数据签名不符"),
    NOT_FOUND(404, "未找到资源"),
    INTERNAL_SERVER_ERROR(500, "服务器内部错误"),
    SERVER_BUSY(503, "服务器忙,请稍后重试。。。")
    ;

    private int resultCode;

    private String resultMsg;

    CommonEnum(int resultCode, String resultMsg) {
        this.resultCode = resultCode;
        this.resultMsg = resultMsg;
    }

    @Override
    public int getResultCode() {
        return this.resultCode;
    }

    @Override
    public String getResultMessage() {
        return this.resultMsg;
    }
}

 

2、然后定义一个JsonResult 类,实现返回参数

package com.example.demo4.handler;

import com.alibaba.fastjson.JSONObject;
import com.example.demo4.enumion.CommonEnum;

class JsonResult {
    /**
     * 响应代码
     */
    private int code;

    /**
     * 响应消息
     */
    private String message;

    /**
     * 响应结果
     */
    private Object result;

    public JsonResult() {
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getResult() {
        return result;
    }

    public void setResult(Object result) {
        this.result = result;
    }

    /**
     * 成功
     *
     * @return
     */
    public static JsonResult success() {
        return success(null);
    }

    /**
     * 成功
     * @param data
     * @return
     */
    public static JsonResult success(Object data) {
        JsonResult rb = new JsonResult();
        rb.setCode(CommonEnum.SUCCESS.getResultCode());
        rb.setMessage(CommonEnum.SUCCESS.getResultMessage());
        rb.setResult(data);
        return rb;
    }

    /**
     * 失败
     */
    public static JsonResult error(int code, String message) {
        JsonResult rb = new JsonResult();
        rb.setCode(code);
        rb.setMessage(message);
        rb.setResult(null);
        return rb;
    }

    /**
     * 失败
     */
    public static JsonResult error( String message) {
        JsonResult rb = new JsonResult();
        rb.setCode(-1);
        rb.setMessage(message);
        rb.setResult(null);
        return rb;
    }

    @Override
    public String toString() {
        return JSONObject.toJSONString(this);
    }

}

3、定义个全局异常捕获类

package com.example.demo4.handler;

import com.example.demo4.enumion.CommonEnum;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.stream.Collectors;

/**
 * validate校验 异常统一捕捉处理类
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public JsonResult MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
        //下边ResultCodeEnum.PARAMS_BS_ERROR.getCode()就是你自己自定义的返回code码
        return JsonResult.error(CommonEnum.SIGNAUTION_NOT_MATCH.getResultCode(),message);
    }

    /**
     * 处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常
     */
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public JsonResult BindExceptionHandler(BindException e) {
        String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
        return JsonResult.error(CommonEnum.SIGNAUTION_NOT_MATCH.getResultCode(),message);
    }

    /**
     * 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是ConstraintViolationException
     */
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseBody
    public JsonResult ConstraintViolationExceptionHandler(ConstraintViolationException e) {
        String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
        return JsonResult.error(CommonEnum.SIGNAUTION_NOT_MATCH.getResultCode(),message);
    }

}

 

 4、用postman测试

http://127.0.0.1:8080/tuser/converter

{
    "userName" : "111",
    "sex" :null,
    "note" : null
}



#返回值如下
{
    "code": 401,
    "message": "性别不能为空备注不能为空",
    "result": null
}

 

 

 

Spring Boot中,全局异常处理通常用于捕获并统一处理应用程序中可能出现的各种异常,包括ValidationException。当使用Spring Data REST或手动验证请求时,如果发生数据校验错误,会抛出ValidationException。为了返回这个异常的信息给前端,你可以创建一个自定义的全局异常处理器。 首先,你需要创建一个实现了`HandlerExceptionResolver`接口的类,例如GlobalExceptionHandler: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice public class GlobalExceptionHandler { @Autowired private MessageSource messageSource; @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public ResponseEntity<ValidationResponse> handleValidationException(MethodArgumentNotValidException ex) { ValidationResponse response = new ValidationResponse(); response.setErrors(new ArrayList<>()); for (FieldError error : ex.getBindingResult().getAllErrors()) { response.getErrors().add(error.getDefaultMessage()); } return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response); } // 可能还需要处理其他类型的异常... private static class ValidationResponse { private List<String> errors; // getters and setters... } } ``` 在这个例子中,我们创建了一个`ValidationResponse`类,用来封装错误消息。当`MethodArgumentNotValidException`被捕获时,从异常中获取`FieldError`列表,并将默认错误消息添加到响应体中。最后,通过`ResponseEntity`返回一个HTTP 400 Bad Request状态码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值