spring boot 输入参数统一校验

时间:2023-03-09 01:16:52
spring boot 输入参数统一校验

1 引入spring boot validate    maven 依赖

 <!-- 验证 -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

2  输入参数 模型 dto
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

package com.example.demo.input;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size; public class AccountCreateInput { @Size(min=6, max=30,message = "账号名长度必须在6,30之间")
private String loginName ;
@NotEmpty(message = "密码不能为空")
private String loginPwd;
private String realName; public String getLoginName() {
return loginName;
} public void setLoginName(String loginName) {
this.loginName = loginName;
} public String getLoginPwd() {
return loginPwd;
} public void setLoginPwd(String loginPwd) {
this.loginPwd = loginPwd;
} public String getRealName() {
return realName;
} public void setRealName(String realName) {
this.realName = realName;
}
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

3 启用统一验证错误处理 。 当参数模型验证未通过,会抛出

MethodArgumentNotValidException  异常,统一处理即可。 
package com.example.demo.config;

import com.example.demo.Infrastructure.FriendlyException;
import com.example.demo.Infrastructure.UnauthorizedException;
import com.example.demo.Infrastructure.http.ResultModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
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; import javax.servlet.http.HttpServletRequest; @ControllerAdvice
public class GlobalExceptionHandler { private Logger logger = LoggerFactory.getLogger(this.getClass()); @ExceptionHandler(value = Exception.class)
@ResponseBody
public ResultModel jsonErrorHandler(HttpServletRequest req, Exception e) { // 友好提示错误
if (e instanceof FriendlyException) {
logger.info(e.getMessage());
return ResultModel.internalServerError(e.getMessage());
}
// 权限校验
else if (e instanceof UnauthorizedException) {
logger.info(e.getMessage());
return ResultModel.Unauthorized(e.getMessage()); }
// 全局统一校验
else if(e instanceof MethodArgumentNotValidException ){
MethodArgumentNotValidException ex = (MethodArgumentNotValidException ) e; BindingResult result = ex.getBindingResult();
StringBuffer sb = new StringBuffer(); for (FieldError error : result.getFieldErrors()) {
String field = error.getField();
String msg = error.getDefaultMessage();
String message = String.format("%s:%s ", field, msg);
sb.append(message);
} return ResultModel.internalServerError(sb.toString());
}

// 未知异常
else {
logger.error(e.getMessage(), e);
return ResultModel.internalServerError(e.toString());
}
} }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

4  在controller 中标注需要验证的输入参数,在CreateAccountInput 参数前,添加@validated 注解

package com.example.demo.controller;

import com.example.demo.Infrastructure.http.ResultModel;
import com.example.demo.domain.Account;
import com.example.demo.input.AccountCreateInput;
import com.example.demo.service.IAccountService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.List; @Api(value = "Account api", description = "api of account")
@RestController
@RequestMapping("/account")
public class AccountController { private Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
IAccountService accountService; @ApiOperation(value = "account index list", notes = "账户列表信息")
@RequestMapping(value = "/index", method = RequestMethod.GET)
public ResultModel index() { List<Account> rows = this.accountService.findAll();
return ResultModel.ok(rows);
} @ApiOperation(value = "create a account", notes = "a account name") @RequestMapping(value = "/create", method = RequestMethod.POST)
public ResultModel create(
@ApiParam(name = "model", value = "input a account entity") @RequestBody @Validated AccountCreateInput model) { this.accountService.Create(model);
Account entity = this.accountService.findAccountByName(model.getLoginName());
return ResultModel.ok(entity);
} @ApiOperation(value = "find account by name", notes = "根据登录名查找账户")
@RequestMapping(value = "/query", method = RequestMethod.GET)
public ResultModel query(@RequestParam String name) {
this.logger.info(String.format("url:/account/query?name=%s ",name)); List<Account> rows = this.accountService.findAllByName(name);
return ResultModel.ok(rows); }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

5 最后swagger  请求时结果:

请求参数,密码不填

spring boot 输入参数统一校验

响应结果:

spring boot 输入参数统一校验