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;
}就这样,为空字符串时,就能跳过验证了。
大家如果有更好的解决方式,希望能指教。
相关推荐
通过 `@Valid` 注解和自定义校验注解,可以在服务端进行表单验证。 ### 第 8 章 文件上传与下载 SpringMVC 支持文件上传和下载功能,通过 `MultipartFile` 类处理文件上传,而文件下载可以通过设置响应头和流操作来...
SpringMVC和SQLiteJDBC是两个在Java开发中常见的组件,它们分别用于构建Web应用程序和服务端数据存储。这里我们详细探讨这两个技术以及它们如何协同工作。 **SpringMVC** SpringMVC是Spring框架的一个模块,专门...
6. **转换器和格式化器**:SpringMVC提供了`@InitBinder`和`@DateTimeFormat`等注解,用于自定义数据绑定和格式化逻辑。 7. **异常处理**:`@ExceptionHandler`注解允许我们为特定类型的异常定义处理方法,这样可以...
`@InitBinder` 可以用来初始化数据绑定,允许开发者自定义数据绑定的行为。`@Valid` 注解用于进行模型对象的验证,配合 Bean Validation 规范,可以实现强大的表单验证功能。 在 RESTful 风格的支持上,Spring MVC ...
5. **统一的请求/响应格式**:在服务端处理请求前,对请求数据进行预处理;在响应后,将结果转化为统一的JSON格式。 总的来说,Interceptor是Spring MVC提供的一种灵活的扩展机制,它增强了应用程序的功能,使得...
要在SpringMVC中使用上述自定义的拦截器,需要在配置文件中进行相应的配置。可以通过XML配置的方式添加拦截器: ```xml ``` #### 六、总结 SpringMVC拦截器是一种非常实用的功能,可以帮助开发者实现诸如权限...
它提供了全面的身份验证和授权服务,允许开发者自定义用户权限,如题目所述的“用户权限完全自定义”。 5. **CXF**:一个开源的SOA(面向服务架构)框架,支持WS-*和RESTful服务。CXF使得创建和消费Web服务变得简单...
它支持JSON字符串作为参数传递,这意味着框架内有JSON解析器,可以将接收到的JSON数据转换为对象,以便在服务端进行处理。同时,它也能处理普通表单参数,这是Web应用中常见的HTTP GET或POST请求中的键值对形式的...
SSM+Netty框架搭建是将Spring、SpringMVC和MyBatis这三大Java企业级开发框架与高性能的网络通信库Netty结合,用于构建高效、稳定且可扩展的网络应用。下面将详细介绍如何实现这样的架构,以及如何通过Netty从Oracle...
SpringMVC提供了依赖注入、AOP(面向切面编程)、数据验证等特性,简化了开发流程。 3. **MySQL数据库**:MySQL是一个流行的开源关系型数据库管理系统,以其高效、稳定和易于管理著称。在这个文创商城系统中,MySQL...
在这个项目中,"oauth2.0的客户端"指的是需要获取用户授权的应用,"oauth2.0的服务端"则是处理授权请求并验证权限的服务器。 在OAuth2.0的客户端实现中,通常需要处理以下几个步骤: 1. 用户访问客户端应用,请求...
5. **配置数据源**:可以使用Spring Boot提供的DataSourceAutoConfiguration自动配置数据源,也可以自定义配置。 6. **创建Service层**:实现业务逻辑,调用Mapper接口进行数据操作。 7. **配置Controller**:创建...
在实际开发中,Quartz可以用来实现诸如数据清理、报表生成、定时任务推送等后台服务,而Shiro则负责用户的身份验证和权限控制,SpringMVC和Spring负责业务流程和依赖管理,MyBatis处理数据库交互。Maven则在整个开发...
首先,Spring MVC通过`<mvc:annotation-driven>`元素启用注解驱动的处理,这允许我们在控制器方法的参数上使用数据验证注解,如`@Size`、`@Email`等。当配置`<mvc:annotation-driven validator="validator">`时,`...
它允许开发者通过处理映射、数据绑定、验证和本地化等功能来分离业务逻辑和用户界面。 接下来,我们关注Ajax技术。Ajax(Asynchronous JavaScript and XML)是一种创建动态网页的技术,它使页面无需刷新即可与...
1. 用户登录与权限管理:基于Spring Security或自定义的权限控制,实现员工的登录验证及不同角色的权限分配。 2. 员工信息管理:录入、修改、删除员工的基本信息,如姓名、职位、入职日期等。 3. 部门管理:创建、...
【SSM珠宝首饰交易平台】是一个综合性的电子商务项目,主要运用了Spring、SpringMVC和MyBatis(简称SSM)三大框架技术,结合Java后端和微信小程序前端,为用户提供了一个便捷、高效的珠宝首饰在线购买与销售平台。...
- **可扩展性**:易于与其他系统集成,支持功能模块的扩展与升级。 #### 五、系统架构 - **前端**:采用JSP技术实现用户界面的展示,支持友好的用户体验。 - **后端**:使用Spring Boot框架进行服务端开发,提供...
- **主要内容**:包括表单设计、数据验证和事务处理等。 #### 同步与异步装载冲突的分析和解决方法(SEUG) - **概述**:分析了同步和异步加载资源时可能出现的问题,并提供了解决方案。 - **主要内容**:避免同步...