专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
老刘说NLP  ·  再看知识图谱本体生成:RAG用于Mysql数 ... ·  21 小时前  
OSC开源社区  ·  苹果用Swift重写每天数十亿次请求的Jav ... ·  昨天  
大淘宝技术  ·  Agent工程能力思考记录 ·  昨天  
京东零售技术  ·  在京东 探索技术的无限可能 ·  4 天前  
51好读  ›  专栏  ›  OSC开源社区

Spring MVC 通过切面,实现超灵活的注解式数据校验

OSC开源社区  · 公众号  · 程序员  · 2017-02-23 08:21

正文

请到「今天看啥」查看全文


//...

Set > validateParameters(

T object, // 需要校验的方法所属对象

Method method,  // 需要校验的方法

Object[] parameterValues, // 需要交验的方法对应的参数

Class>... groups);  // 校验组(这里我们暂时用不到)

//...

}


如何使用呢? 我写了一个测试类来测试这个方法具体返回的内容。

package diamond.cms.server.mvc.valid;


import java.lang.reflect.Method;

import java.util.Set;


import javax.validation.ConstraintViolation;

import javax.validation.Validation;

import javax.validation.ValidatorFactory;

import javax.validation.constraints.NotNull;

import javax.validation.executable.ExecutableValidator;


import org.hibernate.validator.constraints.NotBlank;

import org.hibernate.validator.constraints.Range;

import org.junit.Test;


public class ExecutableValidatorTest {


@Test

public void hibernateVaildTest() throws NoSuchMethodException, SecurityException {

// 需要校验的方法实例

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

ExecutableValidator validator = factory.getValidator().forExecutables();


Method method = this.getClass().getMethod("vaildMethod",  Integer.class, String.class, String.class);

// 校验参数,应该是有两个非法的参数

Object [] params = new Object[]{100, "", "test"};


// 获得校验结果 Set 集合,有多少个字段校验错误 Set 的大小就是多少

Set > constraintViolationSet =

validator.validateParameters(this, method, params);


System.out.println("非法参数校验结果条数: " + constraintViolationSet.size());

constraintViolationSet.forEach(cons -> {

System.out.println("非法消息: " + cons.getMessage());

});


params = new Object[]{10, "build-test", "test"};

constraintViolationSet =

validator.validateParameters(this, method, params);


System.out.println("合法参数校验结果条数: " + constraintViolationSet.size());

}


// 校验示范方法

public void vaildMethod(@NotNull @Range(min = 0, max = 18)Integer age,@NotBlank String build, String test){}

}


上面的方法最终输出:

非法参数校验结果条数: 2

非法消息: 需要在0和18之间

非法消息: 不能为空

合法参数校验结果条数: 0


获得校验所需参数,统一处理进行数据校验


如何去使用我们上面提到的数据校验方法呢?首先我们要想,如何去获得我们需要的参数。我们需要以下参数:

1. 请求执行的目标对象

2.请求执行的方法

3.请求的参数


有两种方式来获得:


1. 通过实现 HandlerInterceptor 拦截器来实现


因为通过拦截器实现,有很多坑要填,这里不推荐使用。主要讲第二个方法,通过AOP来实现校验数据获取。


2. 通过 AOP(切面)来实现校验数据获取








请到「今天看啥」查看全文