`

springmvc服务端数据验证的自定义验证与扩展使用

 
阅读更多

                   springmvc服务端数据验证的自定义验证与扩展使用

 

前面讲了基本的使用,现在讲一下扩展使用,

例如在注册时需要实现注册登录名的唯一性验证,这时可如下 实现:

 

1.创建一个验证登录名的限制注解。

/**
 * 验证登录名是否已被使用的限制注解
 */
@Target({ElementType.FIELD, ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy=LoginNameOnlyValidator.class)
public @interface LoginNameOnly {
        String message() default"登录名已被使用"; 
    
        Class<?>[] groups() default {}; 
        
        Class<? extends Payload>[] payload() default {}; 
}

 

2.建立这个注解的验证执行类:

 

注意:@Autowired
    private RegisterManager registerManager;  这是通过spring依赖注入,因为这里spring已经实现了对jsr-303的支持

 

/**
 * 登录名是否已被使用的注解验证的执行类
 */
public class LoginNameOnlyValidator implements ConstraintValidator<LoginNameOnly, String> {
    @Autowired
    private RegisterManager registerManager;

    @Override
    public void initialize(LoginNameOnly arg0) {}

    @Override
    public boolean isValid(String loginName, ConstraintValidatorContext arg1) {
        if(StringUtils.isBlank(loginName))
            return true;
        return registerManager.getloginNameIsUsed(loginName);
       
    }
}

 

3.在验证模型中使用:

    @LoginNameOnly
    public String getLoginName() {
        return this.loginName;
    }

就这样就可以了。不过如果是在修改过程中,则这个方法不能满足,恐怕只能结合采用编程式验证了。

 

二,这里要说另一种情况:就是对允许空的字段的验证,在界面传过来的值为这样的“”空字符串时,就是界面没有输入,在后台接受值后为“”,这时如果直接加一些验证,会出现验证无法通过。实际需要此时不验证或验证通过。

如字符如果有输入,则长度应为2-10,但可以为空,

我的解决办法是:重写一下长度验证的限制注解及长度验证的验证执行类。

2.1 先写长度的限制注解类

@Documented
@Constraint(validatedBy={LengthBValidator.class})
@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface LengthB
{
  public abstract int min();

  public abstract int max();

  public  String message();

  public  Class<?>[] groups()default {};

  public  Class<? extends Payload>[] payload()default {};

  @Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.PARAMETER})
  @Retention(RetentionPolicy.RUNTIME)
  @Documented
  public static @interface List
  {
    public abstract Length[] value();
  }
}

 

2.2 再重写执行类,

 

public class LengthBValidator  implements ConstraintValidator<LengthB, CharSequence>
{
      private static final Log log = LoggerFactory.make();
      private int min;
      private int max;

      public void initialize(LengthB parameters)
      {
        this.min = parameters.min();
        this.max = parameters.max();
        validateParameters();
      }

      public boolean isValid(CharSequence value, ConstraintValidatorContext constraintValidatorContext) {
        if (value == null) {
          return true;
        }
        int length = value.length();
        if (length == 0) {
              return true;
         }
        return (length >= this.min) && (length <= this.max);
      }

      private void validateParameters() {
        if (this.min < 0) {
          throw log.getMinCannotBeNegativeException();
        }
        if (this.max < 0) {
          throw log.getMaxCannotBeNegativeException();
        }
        if (this.max < this.min)
          throw log.getLengthCannotBeNegativeException();
      }
    }

 

 

实质上加了这两行代码:

  if (length == 0) {
              return true;
         }就这样,为空字符串时,就能跳过验证了。

 

大家如果有更好的解决方式,希望能指教。

分享到:
评论

相关推荐

    SpringMVC完整使用教程

    通过 `@Valid` 注解和自定义校验注解,可以在服务端进行表单验证。 ### 第 8 章 文件上传与下载 SpringMVC 支持文件上传和下载功能,通过 `MultipartFile` 类处理文件上传,而文件下载可以通过设置响应头和流操作来...

    SpringMVC+sqlitejdbc的jar集合

    SpringMVC和SQLiteJDBC是两个在Java开发中常见的组件,它们分别用于构建Web应用程序和服务端数据存储。这里我们详细探讨这两个技术以及它们如何协同工作。 **SpringMVC** SpringMVC是Spring框架的一个模块,专门...

    springMVC的demo

    6. **转换器和格式化器**:SpringMVC提供了`@InitBinder`和`@DateTimeFormat`等注解,用于自定义数据绑定和格式化逻辑。 7. **异常处理**:`@ExceptionHandler`注解允许我们为特定类型的异常定义处理方法,这样可以...

    springmvc3.0

    `@InitBinder` 可以用来初始化数据绑定,允许开发者自定义数据绑定的行为。`@Valid` 注解用于进行模型对象的验证,配合 Bean Validation 规范,可以实现强大的表单验证功能。 在 RESTful 风格的支持上,Spring MVC ...

    SpringMVC中使用Interceptor拦截器

    5. **统一的请求/响应格式**:在服务端处理请求前,对请求数据进行预处理;在响应后,将结果转化为统一的JSON格式。 总的来说,Interceptor是Spring MVC提供的一种灵活的扩展机制,它增强了应用程序的功能,使得...

    Java实训教程 Java软件开发实战 Java开发框架介绍 SpringMVC_10_拦截器 共7页.pptx

    要在SpringMVC中使用上述自定义的拦截器,需要在配置文件中进行相应的配置。可以通过XML配置的方式添加拦截器: ```xml ``` #### 六、总结 SpringMVC拦截器是一种非常实用的功能,可以帮助开发者实现诸如权限...

    Maven+SpringMVC+Hibernate4+Security+CXF+SiteMesh

    它提供了全面的身份验证和授权服务,允许开发者自定义用户权限,如题目所述的“用户权限完全自定义”。 5. **CXF**:一个开源的SOA(面向服务架构)框架,支持WS-*和RESTful服务。CXF使得创建和消费Web服务变得简单...

    自己手写的mvc,仿照Springmvc

    它支持JSON字符串作为参数传递,这意味着框架内有JSON解析器,可以将接收到的JSON数据转换为对象,以便在服务端进行处理。同时,它也能处理普通表单参数,这是Web应用中常见的HTTP GET或POST请求中的键值对形式的...

    SSM+Netty框架搭建

    SSM+Netty框架搭建是将Spring、SpringMVC和MyBatis这三大Java企业级开发框架与高性能的网络通信库Netty结合,用于构建高效、稳定且可扩展的网络应用。下面将详细介绍如何实现这样的架构,以及如何通过Netty从Oracle...

    文创商城系统 JAVA+MySQL SpringMVC框架 源码+数据库+素材.rar

    SpringMVC提供了依赖注入、AOP(面向切面编程)、数据验证等特性,简化了开发流程。 3. **MySQL数据库**:MySQL是一个流行的开源关系型数据库管理系统,以其高效、稳定和易于管理著称。在这个文创商城系统中,MySQL...

    ssm搭建、Oauth2.0客户端和服务端

    在这个项目中,"oauth2.0的客户端"指的是需要获取用户授权的应用,"oauth2.0的服务端"则是处理授权请求并验证权限的服务器。 在OAuth2.0的客户端实现中,通常需要处理以下几个步骤: 1. 用户访问客户端应用,请求...

    spring-boot、springmvc、mybatis集成

    5. **配置数据源**:可以使用Spring Boot提供的DataSourceAutoConfiguration自动配置数据源,也可以自定义配置。 6. **创建Service层**:实现业务逻辑,调用Mapper接口进行数据操作。 7. **配置Controller**:创建...

    shiro+SpringMVC+Spring+mybatis+maven+mybatis 自动刷新+ Quartz scheduler 定时器

    在实际开发中,Quartz可以用来实现诸如数据清理、报表生成、定时任务推送等后台服务,而Shiro则负责用户的身份验证和权限控制,SpringMVC和Spring负责业务流程和依赖管理,MyBatis处理数据库交互。Maven则在整个开发...

    JSP中springmvc配置validator的注意事项

    首先,Spring MVC通过`&lt;mvc:annotation-driven&gt;`元素启用注解驱动的处理,这允许我们在控制器方法的参数上使用数据验证注解,如`@Size`、`@Email`等。当配置`&lt;mvc:annotation-driven validator="validator"&gt;`时,`...

    SpringMvc整合ajax,jQuery单文件/多文件上传

    它允许开发者通过处理映射、数据绑定、验证和本地化等功能来分离业务逻辑和用户界面。 接下来,我们关注Ajax技术。Ajax(Asynchronous JavaScript and XML)是一种创建动态网页的技术,它使页面无需刷新即可与...

    基于springboot人事管理系统.zip

    1. 用户登录与权限管理:基于Spring Security或自定义的权限控制,实现员工的登录验证及不同角色的权限分配。 2. 员工信息管理:录入、修改、删除员工的基本信息,如姓名、职位、入职日期等。 3. 部门管理:创建、...

    基于ssm珠宝首饰交易平台.zip

    【SSM珠宝首饰交易平台】是一个综合性的电子商务项目,主要运用了Spring、SpringMVC和MyBatis(简称SSM)三大框架技术,结合Java后端和微信小程序前端,为用户提供了一个便捷、高效的珠宝首饰在线购买与销售平台。...

    基于SpringBoot的装饰工程管理系统源码数据库.doc

    - **可扩展性**:易于与其他系统集成,支持功能模块的扩展与升级。 #### 五、系统架构 - **前端**:采用JSP技术实现用户界面的展示,支持友好的用户体验。 - **后端**:使用Spring Boot框架进行服务端开发,提供...

    Dorado7研发文档

    - **主要内容**:包括表单设计、数据验证和事务处理等。 #### 同步与异步装载冲突的分析和解决方法(SEUG) - **概述**:分析了同步和异步加载资源时可能出现的问题,并提供了解决方案。 - **主要内容**:避免同步...

Global site tag (gtag.js) - Google Analytics