在处理后端的业务逻辑是经常会涉及表单数据的提交请求,咱们不只在前端对数据进行验证,并且在后端也须要对数据进行验证,以此来保证数据的完整性,然后端对于表单数据的验证使用的最多的莫过于JSR303。前端
一、表单验证的使用
二、因为表单验证引发的异常捕获
java
使用JSR303,咱们须要引入依赖,通常来讲咱们只须要引入javax.validation
便可,可是对于一些javax.validation
没法验证的(例如URL)咱们就须要引入hibernate
来进行验证了。json
<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>6.0.18.Final</version> <scope>compile</scope> </dependency>
自定义验证规则,最方便的莫过于使用注解的方式对咱们的bean进行验证,而且能够返回咱们本身定义的返回消息。后端
JSR注释:api
在JSR中能够找到一些其余注释:数组
@Data @TableName("pms_brand") public class BrandEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 品牌id */ @TableId private Long brandId; /** * 品牌名 */ @NotEmpty(message = "品牌名不能为空") private String name; /** * 品牌logo地址 */ @URL(message = "必须是一个合法的地址") private String logo; /** * 介绍 */ @NotEmpty(message = "介绍不能为空") private String descript; /** * 显示状态[0-不显示;1-显示] */ private Integer showStatus; /** * 检索首字母 */ @NotEmpty(message = "检索首字母不能为空") @Pattern(regexp = "/^[a-zA-Z]$/",message = "检索必须是一个字母") private String firstLetter; /** * 排序 */ @NotNull(message = "排序不能为空") @Min(value = 0,message = "排序的数必须大于等于零") private Integer sort; }
在对bean进行验证后,咱们须要捕获咱们的验证结果。app
@Valid
为验证级联标记属性、方法参数或方法返回类型。也就是说咱们使用这个注解后验证才生效。result.hasErrors()
判断是否有异常,使用 result.getFieldErrors()
获取验证后的详细数据/** * 保存 */ @RequestMapping("/save") public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){ Map<String,String> map = new LinkedHashMap<>(); if (result.hasErrors()){ result.getFieldErrors().forEach(item ->{ String message = item.getDefaultMessage(); String field = item.getField(); map.put(field, message); }); return R.error(400,"数据不合法").put("data",map); }else { brandService.save(brand); return R.ok(); } }
全部的controller制做厂的逻辑处理,咱们则须要使用一个统一的controller进行全部异常的捕获测试
一、正常的控制器处理正常的逻辑 /** * 保存 */ @RequestMapping("/save") public R save(@Valid @RequestBody BrandEntity brand){ brandService.save(brand); return R.ok(); } 二、编写一个controllerAdvice进行异常统一处理 @RestControllerAdvice("com.lomtom.mall.product.controller") public class ExceptionController { @ExceptionHandler(value = MethodArgumentNotValidException.class) public R handleValidException(MethodArgumentNotValidException e){ BindingResult result = e.getBindingResult(); Map<String,String> map = new LinkedHashMap<>(); result.getFieldErrors().forEach(item -> { String message = item.getDefaultMessage(); String field = item.getField(); map.put(field, message); }); return R.error(400, "数据不合法").put("data", map); } }
与第二种同理,只是新增枚举统一管理异常的状态码与消息提醒,翻遍代码的修改与查看this
一、编写枚举 public enum ExceptionEnum { DATA_EXCEPTION(400,"数据不合法"); private Integer code; private String message; ExceptionEnum(Integer code, String message) { this.code = code; this.message = message; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } 二、与第二种惟一不一样的是全部的状态码与消息提示交给枚举 return R.error(ExceptionEnum.DATA_EXCEPTION.getCode(), ExceptionEnum.DATA_EXCEPTION.getMessage()).put("data", map);
发送请求获取返回,全部的返回结果都同样,只是实现的方式稍有不一样而已。hibernate
{ "msg": "数据不合法", "code": 400, "data": { "name": "品牌名不能为空", "descript": "介绍不能为空", "sort": "排序不能为空", "firstLetter": "检索首字母不能为空" } }
关注公众号:博奥思园
仍是那句话:你的支持是我前进的最大动力