文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

javax.validation结合spring的示例分析

2023-06-20 18:24

关注

这篇文章主要为大家展示了“javax.validation结合spring的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javax.validation结合spring的示例分析”这篇文章吧。

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

注解如下:

javax.validation结合spring的示例分析

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

javax.validation结合spring的示例分析

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;@Getter@AllArgsConstructorpublic 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;@AllArgsConstructorpublic 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;@AllArgsConstructor@Getterpublic 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;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@AllArgsConstructorpublic 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 ) {ValidatorProvider validatorProvider = getValidatorProvider();ViolationBuild validateFlaw = validatorProvider.validate(submitVO);System.out.println(validateFlaw.getMessage()); }

打印结果:请控制在100个字符以内

以上是“javax.validation结合spring的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯