Swagger接口注解及表单校验、分组校验
程序员文章站
2022-07-13 14:31:05
...
先讲解以下几个关键点
表单校验的关键在于注解:@Validated
分组校验的关键在于 @Validated({UpdateGroup.User.class}) 校验规则有定义UpdateGroup.User.class 就会启用该校验规则
UpdateGroup 可以自行定义
表单校验信息捕获当然就是handleMethodArgumentNotValidException 中的代码来处理了 这里可以根据实际情况就行修改
Swagger的两个关键注解 @Api @ApiOperation
废话不多说 直接上代码
//表单校验 抛出异常信息
@RestControllerAdvice
public class RRExceptionHandler {
/**
* 自定义注解异常拦截
* @param e
* @param request
* @return
*/
@ExceptionHandler({BindException.class, ConstraintViolationException.class, MethodArgumentNotValidException.class})
public R handleMethodArgumentNotValidException(Exception e, HttpServletRequest request) {
// 错误信息
StringBuilder sb = new StringBuilder("参数校验失败:");
String msg = "";
if (!(e instanceof BindException) && !(e instanceof MethodArgumentNotValidException)) {
for (ConstraintViolation cv: ((ConstraintViolationException)e).getConstraintViolations()) {
msg = cv.getMessage();
sb.append(msg).append(";");
Iterator<Path.Node> it = cv.getPropertyPath().iterator();
Path.Node last = null;
while (it.hasNext()) {
last = (Path.Node)it.next();
}
}
} else {
List<ObjectError> allErrors = null;
if (e instanceof BindException) {
allErrors = ((BindException)e).getAllErrors();
} else {
allErrors = ((MethodArgumentNotValidException)e).getBindingResult().getAllErrors();
}
// 拼接错误信息
for (ObjectError oe : allErrors) {
msg = oe.getDefaultMessage();
sb.append(msg).append(";");
}
}
return R.error(sb.toString());
}
}
//controller 校验示例
@RestController
@RequestMapping("/user")
@Api(tags = "用户管理")
public class SysUserController {
/**
* 保存用户
*/
@PostMapping("/save")
@ApiOperation("添加用户")
public R save(@RequestBody @Valid AddUserForm form){
//业务逻辑处理
return R.ok();
}
/**
* 修改用户
*/
@PostMapping("/update")
@ApiOperation("修改用户")
public R update(@RequestBody @Validated({UpdateGroup.User.class}) UpdateUserForm form){
//业务逻辑处理
return R.ok();
}
}
//from表单
//新增表单
@Data
@ApiModel
public class AddUserForm {
* 用户名
*/
@NotBlank(message="用户名不能为空")
@ApiModelProperty(value = "用户名",required = true, groups = UpdateGroup.User.class
)
private String username;
/**
* 邮箱
*/
@Email(message="邮箱格式不正确")
@ApiModelProperty(value = "邮箱",required = true)
private String email;
/**
* 手机号
*/
@NotBlank(message="手机号不能为空")
@ApiModelProperty(value = "手机号",required = true)
private String phone;
/**
* 部门ID
*/
@NotNull(message="部门不能为空")
@ApiModelProperty(value = "部门ID",required = true)
private Long deptId;
}
//更新表单
@Data
@ApiModel
public class UpdateUserForm {
/**
* 用户名
*/
@NotBlank(message="用户名不能为空")
@ApiModelProperty(value = "用户名",required = true)
private String username;
/**
* 邮箱
*/
@Email(message="邮箱格式不正确")
@ApiModelProperty(value = "邮箱",required = true)
private String email;
/**
* 手机号
*/
@NotBlank(message="手机号不能为空")
@ApiModelProperty(value = "手机号",required = true)
private String phone;
/**
* 部门ID
*/
@NotNull(message="部门不能为空")
@ApiModelProperty(value = "部门ID",required = true)
private Long deptId;
}
/**
* 更新数据 Group
* 分组校验
*
*/
public interface UpdateGroup {
public interface User {
}
}
表单校验的关键在于注解:@Validated
分组校验的关键在于 @Validated({UpdateGroup.User.class}) 校验规则有定义UpdateGroup.User.class 就会启用该校验规则
UpdateGroup 可以自行定义
表单校验信息捕获当然就是handleMethodArgumentNotValidException 中的代码来处理了 这里可以根据实际情况就行修改
Swagger的两个关键注解 @Api @ApiOperation
废话不多说 直接上代码
//表单校验 抛出异常信息
@RestControllerAdvice
public class RRExceptionHandler {
/**
* 自定义注解异常拦截
* @param e
* @param request
* @return
*/
@ExceptionHandler({BindException.class, ConstraintViolationException.class, MethodArgumentNotValidException.class})
public R handleMethodArgumentNotValidException(Exception e, HttpServletRequest request) {
// 错误信息
StringBuilder sb = new StringBuilder("参数校验失败:");
String msg = "";
if (!(e instanceof BindException) && !(e instanceof MethodArgumentNotValidException)) {
for (ConstraintViolation cv: ((ConstraintViolationException)e).getConstraintViolations()) {
msg = cv.getMessage();
sb.append(msg).append(";");
Iterator<Path.Node> it = cv.getPropertyPath().iterator();
Path.Node last = null;
while (it.hasNext()) {
last = (Path.Node)it.next();
}
}
} else {
List<ObjectError> allErrors = null;
if (e instanceof BindException) {
allErrors = ((BindException)e).getAllErrors();
} else {
allErrors = ((MethodArgumentNotValidException)e).getBindingResult().getAllErrors();
}
// 拼接错误信息
for (ObjectError oe : allErrors) {
msg = oe.getDefaultMessage();
sb.append(msg).append(";");
}
}
return R.error(sb.toString());
}
}
//controller 校验示例
@RestController
@RequestMapping("/user")
@Api(tags = "用户管理")
public class SysUserController {
/**
* 保存用户
*/
@PostMapping("/save")
@ApiOperation("添加用户")
public R save(@RequestBody @Valid AddUserForm form){
//业务逻辑处理
return R.ok();
}
/**
* 修改用户
*/
@PostMapping("/update")
@ApiOperation("修改用户")
public R update(@RequestBody @Validated({UpdateGroup.User.class}) UpdateUserForm form){
//业务逻辑处理
return R.ok();
}
}
//from表单
//新增表单
@Data
@ApiModel
public class AddUserForm {
* 用户名
*/
@NotBlank(message="用户名不能为空")
@ApiModelProperty(value = "用户名",required = true, groups = UpdateGroup.User.class
)
private String username;
/**
* 邮箱
*/
@Email(message="邮箱格式不正确")
@ApiModelProperty(value = "邮箱",required = true)
private String email;
/**
* 手机号
*/
@NotBlank(message="手机号不能为空")
@ApiModelProperty(value = "手机号",required = true)
private String phone;
/**
* 部门ID
*/
@NotNull(message="部门不能为空")
@ApiModelProperty(value = "部门ID",required = true)
private Long deptId;
}
//更新表单
@Data
@ApiModel
public class UpdateUserForm {
/**
* 用户名
*/
@NotBlank(message="用户名不能为空")
@ApiModelProperty(value = "用户名",required = true)
private String username;
/**
* 邮箱
*/
@Email(message="邮箱格式不正确")
@ApiModelProperty(value = "邮箱",required = true)
private String email;
/**
* 手机号
*/
@NotBlank(message="手机号不能为空")
@ApiModelProperty(value = "手机号",required = true)
private String phone;
/**
* 部门ID
*/
@NotNull(message="部门不能为空")
@ApiModelProperty(value = "部门ID",required = true)
private Long deptId;
}
/**
* 更新数据 Group
* 分组校验
*
*/
public interface UpdateGroup {
public interface User {
}
}