您当前的位置: 首页 > 

java持续实践

暂无认证

  • 1浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

谷粒商城59-商品服务-API-品牌管理-JSR303数据校验

java持续实践 发布时间:2020-10-04 16:09:49 ,浏览量:1

文章目录
      • 品牌名称后端参数校验示例
      • 品牌其他参数校验
      • JSR303校验步骤总结

品牌名称后端参数校验示例

validation-api-2.0.1.Final.jar包中 ,提供了如下的注解, 用于参数的校验 例如有如下的注解

  • @NotNull The annotated element must not be null. Accepts any type. 用于校验不能为null
  • @NotEmpty The annotated element must not be null nor empty. Supported types : CharSequence(字符集合) Collection(集合) Map Array(数组) 即校验字符集合,集合, map, 数组不能为null ,
  • @NotBlank: The annotated element must not be null and must contain at least one non-whitespace character. Accepts CharSequence. 用于校验字符串, 不能为null , 并且至少有一个字符.

示例: 在品牌实体类name属性加上@NotBlank 注解, 用于校验不能为null , 且至少要有一个字符 在这里插入图片描述 在相应的接口上加上@Valid 才能使得参数校验的功能生效 在这里插入图片描述 开启产品的服务, postman中输入如下的请求, 进行测试 localhost:9898/product/brand/save name 传递一个空字符串 在这里插入图片描述 响应的参数如下 . 提示了参数的错误, 但是响应的数据格式不符合规范.

{
    "timestamp": "2020-10-04T07:08:49.302+0000",
    "status": 400,
    "error": "Bad Request",
    "errors": [
        {
            "codes": [
                "NotBlank.brandEntity.name",
                "NotBlank.name",
                "NotBlank.java.lang.String",
                "NotBlank"
            ],
            "arguments": [
                {
                    "codes": [
                        "brandEntity.name",
                        "name"
                    ],
                    "arguments": null,
                    "defaultMessage": "name",
                    "code": "name"
                }
            ],
            "defaultMessage": "不能为空",
            "objectName": "brandEntity",
            "field": "name",
            "rejectedValue": "",
            "bindingFailure": false,
            "code": "NotBlank"
        }
    ],
    "message": "Validation failed for object='brandEntity'. Error count: 1",
    "path": "/product/brand/save"
}

提示信息是在hibernate-validator-6.0.18.Final.jar 包下的ValidationMessages_zh_CN.properties文件中, 如下图所示 在这里插入图片描述 其注解有属性message , 用于给不符合参数校验的提示信息 例如可以给品牌名校验提示品牌名称至少填写一个字符! 在这里插入图片描述 重启服务 再次发送请求, 可以看到如下的提示. 在这里插入图片描述 后端接口可以写成如下的形式 , 在接口方法的形式参数上写 BindingResult 用于获取校验的参数的结果.

  /**
     * 保存
     */
    @RequestMapping("/save")
    public R save(@Valid @RequestBody BrandEntity brand , BindingResult result){
        //判断是否有参数错误
        if (result.hasErrors()) {
            HashMap errorMap = new HashMap();

            result.getFieldErrors().forEach((item) -> {
                //获取错误提示消息
                String message = item.getDefaultMessage();

                // 获取错误属性的名称
                String field = item.getField();
                errorMap.put(field, message);
            });
            return R.error(400, "提交的数据不合法").put("data", errorMap);
        } else {
            brandService.save(brand);
            return R.ok();
        }
    }

改造之后, 响应数据如下 : 在这里插入图片描述

品牌其他参数校验

修改品牌实体类如下, 给品牌实体类的其他属性, 也加上参数校验的注解. @Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母必须是一个字母") 为正则表达式, 校验是否属于字母. @Min(value = 0, message = "排序必须为大于等于0的正整数") 用于校验数字的最小值是否为0.

package com.atguigu.gulimall.product.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
import org.hibernate.validator.constraints.URL;
import javax.validation.constraints.*;
/**
 * 品牌
 * 
 * @author thc
 * @email thc@gmail.com
 * @date 2020-06-25 11:28:26
 */
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	/**
	 * 品牌id
	 */
	@TableId
	private Long brandId;
	/**
	 * 品牌名
	 */
    @NotBlank(message = "品牌名称至少填写一个字符!")
	private String name;

	/**
	 * 品牌logo地址
	 */
	@NotEmpty
	@URL(message = "logo必须是一个合法的url地址")
	private String logo;

	/**
	 * 介绍
	 */
	private String descript;

	/**
	 * 显示状态[0-不显示;1-显示]
	 */
	private Integer showStatus;

	/**
	 * 检索首字母
	 */
    @NotEmpty
	@Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母必须是一个字母")
	private String firstLetter;
	/**
	 * 排序
	 */
    @NotNull
	@Min(value = 0, message = "排序必须为大于等于0的正整数")
	private Integer sort;

}

再次发送请求, 可以看到校验的参数如下, 提示了一些参数不能为空. 在这里插入图片描述

JSR303校验步骤总结
  1. 给Bean添加校验注解,javax.validation.constraints 包下面的, 并定义自己的message提示
  2. 在Controller接口开启校验功能 , 加上@Valid 注解. 效果是如果有校验错误的参数, 会有默认的响应, 但是不符合项目统一的响应, 因此下一节会写一个统一的响应.
  3. 给校验的接口后面, 统一跟一个BindingResult , 可以获得此次校验的结果.
关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0447s