博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义java validation
阅读量:6172 次
发布时间:2019-06-21

本文共 4550 字,大约阅读时间需要 15 分钟。

hot3.png

java自带的和hibernate validation有一些常规的校验,但是实际工作中可能不够用。。。

一,参考的资料和别人博客:

其中本人遇到的报错:

javax.validation.ValidationException: HV000183: Unable to load 'javax.el.ExpressionFactory'

解决方案:

javax.el
javax.el-api
2.2.4
org.glassfish.web
javax.el
2.2.4

二、以自定义枚举校验器为例

1,定义枚举

package com.joindata.bss.model.ad;/** * Created by lijunhao on 2017/2/8. */public enum AdType {    /**订单详情*/    ORDER_DETAIL,    /**支付成功*/    PAY_SUCCESS,    /**portal页*/    PORTAL,    /**成功页*/    SUCCESS}

2,定义方法:EnumValidation

这个就是在bean属性上注释的名称,这里定义注释名称上的属性值,我在这里加的是Class<?> value(); 为了在校验器里的value中输入枚举类(class)

@Target( { METHOD, FIELD, ANNOTATION_TYPE }) @Retention(RUNTIME) @Constraint(validatedBy = EnumValidator.class) @Documented 以上几项的说明参考开头的资料

package com.joindata.bss.validation;import static java.lang.annotation.ElementType.*;import static java.lang.annotation.RetentionPolicy.*;import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.Target;import javax.validation.Constraint;import javax.validation.Payload;/** * Created by lijunhao on 2017/2/9. */@Target( { METHOD, FIELD, ANNOTATION_TYPE })@Retention(RUNTIME)@Constraint(validatedBy = EnumValidator.class)@Documentedpublic @interface EnumValidation {    String message() default "{请输入正确的类型}";    Class
[] groups() default {}; Class
[] payload() default {}; //自己定义的 Class
value();}

3,书写校验器

  • 在定义的方法中指定校验类 此校验类实现接口ConstraintValidator<EnumValidation, String>,其中第一个参数为第2步命名的方法,第2个是bean中所要校验的值,此接口有2个方法,源码如下:

输入图片说明

  • 第一个initialize方法是对输入东西的做校验前的处理

  • 第二个isValid方法是做校验 返回的是布尔值(Boolean),true的话是校验通过,false的话是校验失败。校验失败返回的就是步骤2中的message信息(messagr可以覆盖默认的值)

具体实现方式,参考下面的代码

package com.joindata.bss.validation;import org.apache.commons.lang.StringUtils;import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext;import java.util.ArrayList;import java.util.List;/** * Created by lijunhao on 2017/2/9. */public class EnumValidator implements ConstraintValidator
{ private List
objects; @Override public void initialize(EnumValidation constraintAnnotation) { Class
value = (Class
) constraintAnnotation.value(); Enum[] enumConstants = value.getEnumConstants(); objects = new ArrayList<>(); for (Enum enumConstant : enumConstants) { objects.add(enumConstant.name()); } } @Override public boolean isValid(String value, ConstraintValidatorContext context) { if(StringUtils.isBlank(value)||objects.contains(value)){ return true; } return false; }}

4,测试方法:

bean中:

package com.joindata.bss.vo.invo;import com.joindata.bss.model.ad.AdType;import com.joindata.bss.validation.EnumValidation;import org.hibernate.validator.constraints.NotBlank;import java.io.Serializable;/** * Created by lijunhao on 2017/1/18. */public class CheckSendCodeInvo implements Serializable{    @EnumValidation(value = AdType.class,message = "请输入正确的广告类型")    private String macRecondId;    public String getMacRecondId() {        return macRecondId;    }    public void setMacRecondId(String macRecondId) {        this.macRecondId = macRecondId;    }}

Main:

package com.joindata.bss.service;import com.joindata.bss.vo.invo.CheckSendCodeInvo;import javax.validation.ConstraintViolation;import javax.validation.Validation;import javax.validation.Validator;import javax.validation.ValidatorFactory;import java.util.ArrayList;import java.util.List;import java.util.Set;/** * Created by lijunhao on 2017/2/9. */public class Test {    public static void main(String[] args) {        CheckSendCodeInvo checkSendCodeInvo = new CheckSendCodeInvo();        checkSendCodeInvo.setCode("dsds");        checkSendCodeInvo.setMacRecondId("ORD_DETAIL");        checkSendCodeInvo.setPhone("dsdsdsd");        ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();        Validator validator = validatorFactory.getValidator();        Set
> validate = validator.validate(checkSendCodeInvo); List
messageList = new ArrayList<>(); for (ConstraintViolation
constraintViolation : validate) { messageList.add(constraintViolation.getMessage()); } messageList.stream().forEach(System.out::println); }}

结果:

输入图片说明

大功告成!!!

转载于:https://my.oschina.net/lijunhao2016/blog/834723

你可能感兴趣的文章
《Metasploit渗透测试手册》—第1章1.10节分析数据库中存储的渗透测试结果
查看>>
《Adobe Acrobat XI经典教程》—第2课减小文件大小
查看>>
《数据库技术原理与应用教程》一第2章 数据库的基础知识
查看>>
QuaggaJS —— 纯 JavaScript 开发的条形码扫描
查看>>
在图片中加入噪点就能骗过 Google 最顶尖的图像识别 AI
查看>>
免费下载!业界首部安卓热修复宝典出炉,阿里技术大牛联袂推荐
查看>>
OpenID 关联认证提供 CoreOS dex
查看>>
《Node.js区块链开发》一2.2 信用,决定着利益转移的方向
查看>>
Speedy:来自京东的 Docker 镜像存储系统
查看>>
《动手玩转Arduino》——11.2 众多的Arduino板
查看>>
IBM Watson 进入癌症基因组分析市场
查看>>
在 Linux 中查看你的时区
查看>>
Linux集群和自动化维1.6 小结
查看>>
《OpenACC并行编程实战》—— 第1章 并行编程概览 1.1 加速器产品
查看>>
C语言OJ项目参考(2417) 字符串长度
查看>>
ajax的手写、封装和自定义设置
查看>>
class path resource [META-INF/xfire/services.xml] cannot be opened because it does not exist
查看>>
android自定义属性
查看>>
ERROR 1114 (HY000): The table 'table1' is full
查看>>
知乎网友神回复:哪怕是平时聊天吹牛的也没见程序员晒,这是为什么呢?
查看>>