javax.validation结合spring最佳实践

14 篇文章 0 订阅
12 篇文章 0 订阅

前言

本人先将用到的配置、工具类贴出来,然后一步步告诉大家怎么使用

JSR303 是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面,就可以在需要校验的时候进行校验了。注解如下:
这里写图片描述

Hibernate validator 在JSR303的基础上对校验注解进行了扩展,扩展注解如下:

这里写图片描述

pom中添加注解

        <!--jsr 303-->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
        <!-- hibernate validator-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.0.Final</version>
        </dependency>

Spring配置

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

自己的Violation实体

这里使用的Lombok获取get和set,使用的@Getter注解
@AllArgsConstructor 这个注解是lombok中为类提供一个全参的构造方法

package com.alibaba.xianzhi.validator;

import java.io.Serializable;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * Created by Jackielee on 2017
 * @author: lizhilong
 * @date:   2017-11-14 18:01:34   
 */
@Getter
@AllArgsConstructor
public class Violation implements Serializable {

    private static final long serialVersionUID = -1731546219600067986L;

    private final String message;

    private final Object bean;

    private final String property;

    private final Object value;
}

封装一个ViolationBuild

后面会说这个类的用法

package com.alibaba.xianzhi.validator;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.validation.ConstraintViolation;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.collections.CollectionUtils;

/**
 * @author: lizhilong
 * @date:   2017-11-15 11:41:12   
 */
@AllArgsConstructor
public class ViolationBuild{

    @Getter
    private Set<Violation> violations;

    public String getMessage() {
        List<String> list = new ArrayList<String>();
        for (Violation violation : violations) {
            list.add(violation.getMessage());
        }
        return list.size() > 0 ? list.get(0) : "";
    }

    public static <T> ViolationBuild build(Set<ConstraintViolation<T>> cvs) {
        Set<Violation> result = new HashSet<Violation>();
        if (CollectionUtils.isNotEmpty(cvs)) {
            for (ConstraintViolation cv : cvs) {
                result.add(new Violation(cv.getMessage(), cv.getRootBean() == null ? null : cv.getRootBean().toString(),
                                         cv.getPropertyPath() == null ? null : cv.getPropertyPath().toString(),
                                         cv.getInvalidValue()));
            }
        }
        return new ViolationBuild(result);
    }
}

用来校验实体,构建并存储校验后的信息ValidatorProvider

package com.alibaba.xianzhi.validator;

import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.ValidationException;
import javax.validation.Validator;

import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * @author: lizhilong
 * @date:   2017-11-15 11:40:59   
 */
@AllArgsConstructor
@Getter
public class ValidatorProvider {
    private final Validator validator;

    public <T> ViolationBuild validate(T object) {
        Set<ConstraintViolation<T>> violations;
        try {
            violations = validator.validate(object);
        } catch (IllegalArgumentException iae) {
            throw iae;
        } catch (ValidationException ve) {
            throw ve;
        }
        return ViolationBuild.build(violations);
    }

    public <T> ViolationBuild validate(T object, Class<?>... groups) {
        Set<ConstraintViolation<T>> violations;
        try {
            violations = validator.validate(object, groups);
        } catch (IllegalArgumentException iae) {
            throw iae;
        } catch (ValidationException ve) {
            throw ve;
        }
        return ViolationBuild.build(violations);
    }

    public <T> ViolationBuild validateProperty(T object, String propertyName, Class<?>... groups) {
        Set<ConstraintViolation<T>> violations;
        try {
            violations = validator.validateProperty(object, propertyName, groups);
        } catch (IllegalArgumentException iae) {
            throw iae;
        } catch (ValidationException ve) {
            throw ve;
        }
        return ViolationBuild.build(violations);
    }

    public <T> ViolationBuild validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) {
        Set<ConstraintViolation<T>> violations;
        try {
            violations = validator.validateValue(beanType, propertyName, value, groups);
        } catch (IllegalArgumentException iae) {
            throw iae;
        } catch (ValidationException ve) {
            throw ve;
        }
        return ViolationBuild.build(violations);
    }
}

BaseService让自己的service继承此类

java不能多继承 所以如果已经继承了别的类,可以将此类注入出来
此类是为了拿到一个单例的ValidatorProvider
package com.alibaba.xianzhi.base.web;

import javax.annotation.Resource;
import javax.validation.Validator;

import com.alibaba.xianzhi.validator.ValidatorProvider;

/**
 * BaseService
 * @author: lizhilong
 * @date:   2017-11-15 11:41:24   
 */
public abstract class BaseService {

    @Resource
    protected Validator validator;

    private ValidatorProvider validatorProvider;

    protected ValidatorProvider getValidatorProvider() {
        if (validatorProvider == null) {
            validatorProvider = new ValidatorProvider(validator);
        }
        return validatorProvider;
    }
}

所需校验的实体类

说明:Constants为接口常量

@Getter
@AllArgsConstructor
public class SubmitVO extends BaseVO {

    @NotNull(message="厂商不能为空")
    private Long companyId;

    @Length(min=0, max=100, message="标题请控制在" + Constants.MAX_TITLE + "个字符以内")
    @NotNull(message="标题不能为空")
    private String title;

    @Length(min=0, max=65535, message="修复方案长度不能超过" + Constants.MAX_FIX_ADVICE)
    @NotNull(message="修复方案不能为空")
    private String fixAdvice;
}

下面就是如何使用

public BaseResponse save(SubmitVO submitVO ) {
/**
 * getValidatorProvider()此方法是BaserService中,
 * 上面说到本人的service是继承此  
 * service的所以可以直接用
 **/
ValidatorProvider validatorProvider = getValidatorProvider();
/**
 * validatorProvider调用validate(Object obj)进行校验
 * 返回ViolationBuild 
 **/
ViolationBuild validateFlaw = validatorProvider.validate(submitVO);
/**
 * 此时如果校验有失败的 容器中便会存储信息,ViolationBuild可以通过自己的
 * getMessage方法获取信息(此方法可以自己封装成自己想要的样子)
 **/
System.out.println(validateFlaw.getMessage());
 }
打印结果:标题请控制在100个字符以内
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值