返回顶部
首页 > 资讯 > 后端开发 > Python >基于javax.validation结合spring的最佳实践
  • 550
分享到

基于javax.validation结合spring的最佳实践

2024-04-02 19:04:59 550人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

前言 本人先将用到的配置、工具类贴出来,然后一步步告诉大家怎么使用 jsR303 是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们Ja

前言

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

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;


@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;


@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;

@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;


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 ) {

ValidatorProvider validatorProvider = getValidatorProvider();

ViolationBuild validateFlaw = validatorProvider.validate(submitVO);

System.out.println(validateFlaw.getMessage());
 }

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 基于javax.validation结合spring的最佳实践

本文链接: https://lsjlt.com/news/131279.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 基于javax.validation结合spring的最佳实践
    前言 本人先将用到的配置、工具类贴出来,然后一步步告诉大家怎么使用 JSR303 是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们Ja...
    99+
    2024-04-02
  • javax.validation结合spring的示例分析
    这篇文章主要为大家展示了“javax.validation结合spring的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javax.validation结合spring的示例分析”这篇...
    99+
    2023-06-20
  • spring boot集成p6spy的最佳实践
    目录前言p6spy-spring-boot-starter快速集成第一步:导入依赖第二步:配置application.properties配置智能提示兼容原生所有配置项 前言 P6S...
    99+
    2024-04-02
  • Java和Git结合使用的最佳实践是什么?
    Java和Git都是非常流行的技术,它们的结合使用可以为开发人员带来许多好处。本文将探讨如何在Java项目中使用Git,并介绍一些最佳实践。 使用Git管理Java项目 Git是一种分布式版本控制系统,它可以帮助开发人员管理代码的版本...
    99+
    2023-08-05
    git 开发技术 关键字
  • spring boot集成redisson的最佳实践示例
    目录前言集成jedis实例,xml方式集成前引用的jar spring bean配置xml集成redisson实例,java bean的方式集成前引入的jarjavabea...
    99+
    2024-04-02
  • python编码最佳实践之总结
    相信用python的同学不少,本人也一直对python情有独钟,毫无疑问python作为一门解释性动态语言没有那些编译型语言高效,但是python简洁、易读以及可扩展性等特性使得它大受青睐。 工作中很多同...
    99+
    2022-06-04
    python
  • Spring Data Jpa框架最佳实践示例
    目录前言扩展接口用法SPRING DATA JPA最佳实践一、继承SIMPLEJPAREPOSITORY实现类二、集成QUERYDSL结构化查询1、快速集成2、丰富BaseJpaRe...
    99+
    2024-04-02
  • 关于 Golang 文件关闭的最佳实践
    Golang是一种开发效率高、性能优秀的编程语言,在文件操作方面也有自己的一套最佳实践。本文将探讨关于Golang文件关闭的最佳实践,并结合具体的代码示例进行说明。 在Golang中,...
    99+
    2024-03-11
    文件 golang 关闭 标准库
  • Spring响应机制:Java API中的最佳实践?
    Spring框架是一个非常流行的Java Web应用程序开发框架,它提供了许多功能和API来简化开发过程。其中,Spring的响应机制是开发Web应用程序时必不可少的一部分。在本文中,我们将探讨Spring响应机制的最佳实践,并提供一些演...
    99+
    2023-09-21
    api spring 响应
  • TypeScript 和 Vuex 在 VUE 中的完美结合:优势和最佳实践
    使用类型化的 Vuex 操作: 使用 TypeScript 类型来定义 Vuex 的操作,以防止意外的突变并提高代码的可读性。 类型化 Vuex 突变: 以类型化方式定义 Vuex 突变,以防止对状态进行意外或无效的更改。 类型化 Vu...
    99+
    2024-04-02
  • C++图形编程最佳实践总结
    在 c++++ 图像编程中,遵循最佳实践至关重要,包括:使用现代化的图形库,如 sfml、sdl2 或 opengl。优化性能,涉及使用双缓冲、最小化绘制调用、批处理顶点数据等。有效管理...
    99+
    2024-05-15
    c++ 图形编程
  • ChatGPT和Python的结合:开发智能对话系统的最佳实践
    ChatGPT和Python的结合:开发智能对话系统的最佳实践,需要具体代码示例引言:随着人工智能的迅速发展,智能对话系统成为了人们关注的热点之一。ChatGPT作为一种基于深度学习的对话生成模型,已经在自然语言处理领域取得了显著的成果。然...
    99+
    2023-10-24
    ChatGPT Python 智能对话系统
  • 聚合函数在数据聚合中的最佳实践
    聚合函数在数据聚合中起着非常重要的作用,可以对大量数据进行汇总和计算,以便更好地理解数据的整体情况。以下是一些关于在数据聚合中使用聚合函数的最佳实践: 选择适当的聚合函数:根据数据的性质和分析需求,选择合适的聚合函数进行计算。常用的聚合...
    99+
    2024-08-03
    sql server
  • 两年摸爬滚打 Spring Boot,总结了这 16 条最佳实践
    Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的Spring Boot专家的文章。在本文中,...
    99+
    2023-06-02
  • Python Spring缓存同步的最佳实践是什么?
    在开发过程中,缓存是一个非常重要的概念。缓存可以提高应用程序的性能,减轻数据库的负担。Spring框架提供了缓存支持,可以很方便地实现缓存功能。但是,当多个应用程序同时访问同一个缓存时,就需要考虑缓存同步的问题。本文将介绍Python S...
    99+
    2023-06-07
    spring 同步 缓存
  • Go 索引 Spring 函数的最佳实践是什么?
    在现代应用程序中,函数是不可或缺的组成部分。随着应用程序变得越来越复杂,使用函数来管理代码和业务逻辑变得越来越重要。在这种情况下,索引函数是一项必不可少的任务,因为它可以大大提高应用程序的性能。 Spring 是一个流行的框架,它为 Ja...
    99+
    2023-10-11
    索引 spring 函数
  • 将Python shell与Spring容器集成的最佳实践
    Python shell和Spring容器都是非常常用的工具,它们可以帮助我们完成许多重要的任务。Python shell是一个交互式的Python解释器,可以让我们在控制台中执行Python代码。Spring容器则是一个Java应用程序框...
    99+
    2023-10-15
    shell spring 容器
  • ASP函数和JavaScript结合生成二维码的最佳实践是什么?
    二维码已经成为了现代社会中不可或缺的一部分。通过扫描二维码,我们可以获得各种各样的信息,例如网址、联系方式、产品信息等等。在互联网应用领域,二维码的应用越来越广泛。而如何快速、方便地生成二维码也成为了一个热门话题。本文将介绍ASP函数和J...
    99+
    2023-09-03
    函数 二维码 javascript
  • VMware 服务器的最佳实践:实现最佳性能
    ...
    99+
    2024-04-02
  • MySQL 的 20+ 条最佳实践
    数据库操作是当今 Web 应用程序中的主要瓶颈。 不仅是 DBA(数据库管理员)需要为各种性能问题操心,程序员为做出准确的结构化表,优化查询性能和编写更优代码,也要费尽心思。 在本文中,我列出了一些针对程序员的...
    99+
    2022-05-10
    MySQL MySQL
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作