阿粉写了八千多字,只为讲透参数合法性验证)(二)

简介: 最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。 由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出BUG,是公众号的一次改变。 至于排序的具体标准是啥,阿粉也不太清楚,大概和你打开某个公众号的频率有关。 所以如果你想第一时间收到阿粉的文章,可以点击Java极客技术的的头像,再点右上角三个点,进去设置一下【星标】。

三、注解验证

使用注解对数据进行合法性验证,可以说是 java 界一项非常伟大的创新,使用这种方式不仅使的代码变得很简洁,而且阅读起来非常令人赏心悦目!

3.1、依赖包引入

下面我们一起来看看具体的实践方式,以Spring Boot工程为例,如果需要使用注解校验,直接引入spring-boot-starter-web依赖包即可,会自动将注解验证相关的依赖包打入工程!

<!-- spring boot web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

下面在创建实体类的时候,还会用到lombok插件,因此还需要引入lombok依赖包!

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.4</version>
    <scope>provided</scope>
</dependency>

如果是普通的Java工程,引入以下几个依赖包即可!

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.9.Final</version>
</dependency>
<dependency>
     <groupId>javax.el</groupId>
     <artifactId>javax.el-api</artifactId>
     <version>3.0.0</version>
 </dependency>
 <dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.el</artifactId>
    <version>2.2.6</version>
 </dependency>

3.2、注解校验请求对象

紧接着我们来创建一个实体User,用于模拟用户注册时的请求实体对象!

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class User {
    @NotBlank(message = "用户名不能为空!")
    private String userName;
    @Email(message = "邮箱格式不正确")
    @NotBlank(message = "邮箱不能为空!")
    private String email;
    @NotBlank(message = "密码不能为空!")
    @Size(min = 8, max = 16,message = "请输入长度在8~16位的密码")
    private String userPwd;
    @NotBlank(message = "确认密码不能为空!")
    private String confirmPwd;
}

web层创建一个register()注册接口方法,同时在请求参数上添加@Valid,如下:

@RestController
public class UserController {
    @RequestMapping("/register")
    public boolean register(@RequestBody @Valid User user){
        if(!user.getUserPwd().equals(user.getConfirmPwd())){
            throw new CommonException("确认密码与密码不相同,请确认!");
        }
  //业务处理...
        return true;
    }
}

最后自定义一个异常全局处理器,用于处理异常消息,如下:

@Slf4j
@Configuration
public class GlobalWebMvcConfig implements WebMvcConfigurer {
    /**
     * 统一异常处理
     * @param resolvers
     */
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        resolvers.add(new HandlerExceptionResolver() {
            @Override
            public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
                log.error("【统一异常拦截】请求出现异常,内容如下:",e);
                ModelAndView mv = new ModelAndView(new MappingJackson2JsonView());
                String uri = request.getRequestURI();
                if(e instanceof CommonException){
                    //CommonExecption为自定义异常类抛出的异常
                    printWrite(((CommonException) e).getMsg(),((CommonException) e).getData(), uri, mv);
                } else if(e instanceof MethodArgumentNotValidException){
                    //MethodArgumentNotValidException为注解校验异常类
                    //获取注解校验异常信息
                    String error = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage();
                    printWrite(error,null, uri, mv);
                } else {
                    printWrite(e.getMessage(),null, uri, mv);
                }
                return mv;
            }
        });
    }
    /**
     * 异常封装相应结果
     * @param object
     */
    private void printWrite(String msg, Object object, String uri, ModelAndView mv){
        ResResult resResult = new ResResult(uri, object);
        if(msg != null){resResult.setMsg(msg);}
        if(log.isDebugEnabled()){
            log.debug("【response】异常输出结果:" + JSONObject.toJSONString(resResult, SerializerFeature.WriteMapNullValue));
        }
        Map resultMap = BeanToMapUtil.beanToMap(resResult);
        mv.addAllObjects(resultMap);
    }
}

下面我们启动项目,使用postman来测试一把,看看效果如何?

  • 测试字段是否为空

21.jpg

测试邮箱是否合法

22.jpg

测试密码长度是否符合要求

23.jpg

测试密码与确认密码是否相同

24.jpg


相关文章
|
4月前
|
存储 JavaScript 前端开发
文本,三步走构思,富文本点击提交能够存储到数据库当中(下),最快的方法,还是会看资料,因此会整合资料最好,直接看资料最快,因为是JWT的资料,我们要设置好登录的内容,看登录的地方怎样写的
文本,三步走构思,富文本点击提交能够存储到数据库当中(下),最快的方法,还是会看资料,因此会整合资料最好,直接看资料最快,因为是JWT的资料,我们要设置好登录的内容,看登录的地方怎样写的
|
消息中间件 JavaScript 小程序
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
|
测试技术
字符串a和他许久未见面的同父异母的b(模拟)(思维)
字符串a和他许久未见面的同父异母的b(模拟)(思维)
78 0
|
XML 前端开发 安全
【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)
【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)
163 0
【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)
|
Java 数据库连接 Spring
参数校验别再写满屏的 if/else 了,差点被劝退……(上)
参数校验别再写满屏的 if/else 了,差点被劝退…(上)
122 0
参数校验别再写满屏的 if/else 了,差点被劝退……(上)
|
算法 数据安全/隐私保护
软考加密类型题(7个历年类型题【答案在底部】选择题1分必得)
对称秘钥算法也叫:私钥、私有秘钥、共享秘钥。 非对称秘钥算法也叫:公钥、公开秘钥、数字签名。 还有消息摘要加密:MD5
263 0
软考加密类型题(7个历年类型题【答案在底部】选择题1分必得)
参数校验别再写满屏的 if/else 了,差点被劝退……(下)
参数校验别再写满屏的 if/else 了,差点被劝退……(下)
113 0
|
测试技术 数据库
测试用例(包含测经典试点全集图解,强烈建议保存收藏)(一)
测试用例(Test Case)是指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,最终形成文档。简单地认为,测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,用于核实是否满足某个特定软件需求。
736 1
测试用例(包含测经典试点全集图解,强烈建议保存收藏)(一)
|
XML 缓存 前端开发
/和/*的区别记不住?我的答案保你终身难忘
/和/*的区别记不住?我的答案保你终身难忘
/和/*的区别记不住?我的答案保你终身难忘
|
Java Spring
阿粉写了八千多字,只为讲透参数合法性验证)(四)
最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。 由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出BUG,是公众号的一次改变。 至于排序的具体标准是啥,阿粉也不太清楚,大概和你打开某个公众号的频率有关。 所以如果你想第一时间收到阿粉的文章,可以点击Java极客技术的的头像,再点右上角三个点,进去设置一下【星标】。
阿粉写了八千多字,只为讲透参数合法性验证)(四)