在体系中运用Bean Validation验证参数-Java-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝32
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:442回复:0

  在体系中运用Bean Validation验证参数

楼主#
更多 发布于:2016-06-02 20:26

在体系中运用Bean Validation验证参数

为何要运用Bean Validation?

当咱们完成某个接口时,都需求对入参数进行校验。例如下面的代码

public String queryValueByKey(String

parmTemplateCode, String conditionName, String conditionKey, String resultName)

{        checkNotNull(parmTemplateCode, "parmTemplateCode not null");      

 checkNotNull(conditionName, "conditionName not null");      

 checkNotNull(conditionKey, "conditionKey not null");      

 checkNotNull(resultName, "resultName not null");

该办法输入的四个参数都是必填项。用代码进行参数验证带来几个问题

需求写大量的代码来进行参数验证。

需求经过注释来直到每个入参的束缚是啥。

每个程序员做参数验证的办法不一样,参数验证不经过抛出的反常也不一样。

啥是Bean Validation?

Bean Validation是一个经过装备注解来验证参数的结构,它包括两部分Bean

Validation API和Hibernate Validator。

Bean Validation API是Java界说的一个验证参数的标准。

Hibernate Validator是Bean Validation API的一个完成。

迅速开端

引入POM

org.hibernatehibernate-validator5.1.1.Finaljavax.validationvalidation-api1.1.0.Finaljavax.elel-api2.2org.glassfish.webjavax.el2.2.4org.jboss.loggingjboss-logging3.1.3.GAcom.fasterxmlclassmate1.0.0log4jlog4j1.2.13

实例代码如下,能够验证Bean,也能够验证办法参数

import java.lang.reflect.Method;import

java.util.Set;import javax.validation.ConstraintViolation;import

javax.validation.Validation;import javax.validation.Validator;import

javax.validation.constraints.Max;import

javax.validation.constraints.NotNull;import

javax.validation.executable.ExecutableValidator;public class BeanValidatorTest {

   public static void main(String[] args) {        Validator validator =

Validation.buildDefaultValidatorFactory().getValidator();      

 //验证Bean参数,并回来验证结果信息        Car car = new Car();      

 Set<ConstraintViolation> validators = validator.validate(car);      

 for (ConstraintViolationconstraintViolation : validators) {          

 System.out.println(constraintViolation.getMessage());        }        // 验证办法参数

       Method method = null;        try {            method =

Car.class.getMethod("drive", int.class);        } catch (SecurityException e) {

       } catch (NoSuchMethodException e) {        }        Object[]

parameterValues = { 80 };        ExecutableValidator executableValidator =

validator.forExecutables();        Set<ConstraintViolation>

methodValidators = executableValidator.validateParameters(car,          

 method, parameterValues);        for

(ConstraintViolationconstraintViolation : methodValidators) {          

 System.out.println(constraintViolation.getMessage());        }    }    public

static class Car {        private String name;        @NotNull(message =

"车主不能为空")        public String getRentalStation() {            return name;    

   }        public void drive(@Max(75) int speedInMph) {        }  

 }}

履行代码后,输出如下:

车主不能为空最大不能超过75

运用代码验证办法参数

Validation验证不成功也许回来多个验证错误信息,咱们能够包装下,当有错误时直接回来第一个错误的反常。

import static

com.google.common.collect.Iterables.getFirst;import java.util.Set;import

javax.validation.ConstraintViolation;import javax.validation.Validation;import

javax.validation.Validator;/** * 目标验证器 *  * @author tengfei.fangtf * @version

$Id: BeanValidator.java, v 0.1 Dec 30, 2015 11:33:40 PM tengfei.fangtf Exp $

*/public class BeanValidator {    /**     * 验证某个bean的参数     *      * @param

object 被校验的参数     * @throws ValidationException 假如参数校验不成功则抛出此反常     */    public

staticvoid validate(T object) {        //取得验证器        Validator validator =

Validation.buildDefaultValidatorFactory().getValidator();        //履行验证      

 Set<ConstraintViolation> constraintViolations =

validator.validate(object);        //假如有验证信息,则将第一个取出来包装成反常回来      

 ConstraintViolationconstraintViolation = getFirst(constraintViolations,

null);        if (constraintViolation != null) {            throw new

ValidationException(constraintViolation);        }    }}

咱们能够在每个办法的第一行调用BeanValidator.validate来验证参数,测试代码如下,

import static

junit.framework.Assert.assertEquals;import

javax.validation.constraints.Max;import

javax.validation.constraints.NotNull;import org.junit.Test;/** *  * @author

tengfei.fangtf * @version $Id: BeanValidatorTest.java, v 0.1 Dec 30, 2015

11:33:56 PM tengfei.fangtf Exp $ */public class BeanValidatorTest {    @Test  

 public void test() {        try {            BeanValidator.validate(new Car());

       } catch (Exception e) {            assertEquals("rentalStation 车主不能为空",

e.getMessage());        }    }    public static class Car {        private

String name;        @NotNull(message = "车主不能为空")        public String

getRentalStation() {            return name;        }        public void

drive(@Max(75) int speedInMph) {        }    }}

运用阻拦器验证办法参数

咱们在对外暴露的接口的入参中运用Bean Validation

API装备参数束缚,如下XXXService接口

public interface XXXService {GetObjectResponse

getObject(GetObjectRequest getObjectRequest);}

在getObject的GetObjectRequest参数中装备注解来束缚参数。

public class GetObjectRequest {    @Valid  

 @NotNull    private ObjectKey      objectKey;    @Size(max = 9)    private

Map<String, Object> parameters;    @AssertTrue    public boolean

isEntityNameOrCodeAtLeastOneIsNotBlank() {        return isNotBlank(entityName)

|| isNotBlank(entityCode);    }//代码省掉}

编写参数验证阻拦器,当办法被调用时,触发Validator验证器履行验证,假如不经过则抛出ParameterValidationException。

import static

com.google.common.collect.Iterables.getFirst;import java.util.Set;import

javax.validation.ConstraintViolation;import javax.validation.Validation;import

javax.validation.Validator;import

org.aopalliance.intercept.MethodInterceptor;import

org.aopalliance.intercept.MethodInvocation;import org.slf4j.Logger;import

org.slf4j.LoggerFactory;import com.xx.ParameterValidationException;/** *

参数验证阻拦器,基于JSR-303 BeanValidation * * @author tengfei.fangtf * * @version $Id:

TitanValidateInterceptor.java, v 0.1 Nov 23, 2015 11:13:55 PM tengfei.fangtf Exp

$ */public class TitanValidateInterceptor implements MethodInterceptor {  

 private static final Logger LOGGER =

LoggerFactory.getLogger(TitanValidateInterceptor.class);    private final

Validator     validator;    public TitanValidateInterceptor() {        validator

= Validation.buildDefaultValidatorFactory().getValidator();    }    @Override  

 public Object invoke(MethodInvocation invocation) throws Throwable {        if

(LOGGER.isDebugEnabled()) {            LOGGER.debug("Validate arguments");      

 }        //获取参数,并查看是否应当验证        Object[] arguments =

invocation.getArguments();        for (Object argument : arguments) {          

 if (LOGGER.isDebugEnabled()) {                LOGGER.debug("Validate argument:

{}", argument);            }            Set<ConstraintViolation&gt

constraintViolations = validator.validate(argument); &nbsp &nbsp

&nbsp &nbsp &nbsp &nbspConstraintViolationconstraintViolation =

getFirst(constraintViolations, null); &nbsp &nbsp &nbsp &nbsp

&nbsp &nbspif (constraintViolation == null) { &nbsp &nbsp

&nbsp &nbsp &nbsp &nbsp &nbsp &nbspcontinue; &nbsp

&nbsp &nbsp &nbsp &nbsp &nbsp} &nbsp &nbsp &nbsp

&nbsp &nbsp &nbspif (LOGGER.isInfoEnabled()) { &nbsp &nbsp

&nbsp &nbsp &nbsp &nbsp &nbsp

&nbspLOGGER.info(&quotConstraintViolation: {}&quot,

constraintViolation); &nbsp &nbsp &nbsp &nbsp &nbsp

&nbsp} &nbsp &nbsp &nbsp &nbsp &nbsp &nbspthrow new

ParameterValidationException(constraintViolation.getPropertyPath() + &quot

&quot + constraintViolation.getMessage()); &nbsp &nbsp &nbsp

&nbsp} &nbsp &nbsp &nbsp &nbspreturn invocation.proceed();

&nbsp &nbsp}}

装备阻拦器core-service.xml,阻拦XXXService的一切办法。

validateInterceptor

参阅资料

注解装备参阅

http://beanvalidation.org

http://www.ibm.com/developerworks/cn/java/j-lo-jsr303/

http://hibernate.org/validator/

优质IT资源分享社区为你提供此文。

本站有大量优质Java教程视频,资料等资源,包含java基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

java教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客