赞
踩
在传统的单体项目开发中,三层结构WEB层、Service层、DAO层最终是一个整体,调用关系也是一一对应,WEB->Service->DAO的调用关系。程序的”入口“只能是用户从WEB层发起调用,为了对数据负责、也为了避免不合法的数据浪费性能所以会在WEB层做数据校验,而Service层基本处于裸奔的状态。
如今分布式、微服务大行其道,WEB层和Service层未必是一一对应的关系 了,可能是一对多、多对一、多对多的关系,你的Service不一定会有谁来调用,所以在Service层进行数据校验也很有必要了。
在基于SpringBoot
的开发中,SpringBoot
为我们提供了开箱即用的数据校验功能,一个@Validate
注解就能搞定。但是这是在web层,因为一般情况下WEB层会依赖spring-boot-start-web
启动器,启动器内部已经包含完整的数据校验功能。
service层要实现数据校验也很easy,只需要添加以下依赖:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
接下来的数据校验方式就和controller完全一致了。
示例:
//service-api层
public interface UserService {
UserDto loginByUsernameAndPasword(@NotBlank(message = "用户名不能为空") String username,
@NotBlank(message = "密码不能为空") String password);
UserDto insert(@Valid @NotNull(message = "插入对象不能为空") UserDto user);
}
@Validate //标识当前类中方法需要进行参数校验
public class UserServiceImpl implements UserService {
public UserDto loginByUsernameAndPasword(@NotBlank(message = "用户名不能为空") String username,
@NotBlank(message = "密码不能为空") String password) {
//do login...
}
//@Valid标识当前参数需要进行级联校验,不加此注解可能无法完成参数级联校验
public UserDto insert(@Valid @NotNull(message = "插入对象不能为空") UserDto userDto) {
// do insert...
}
}
以上同时用到了@Validate、@Valid两个注解,两者区别:
@Valid由JSR303定义、@Validate由Spring定义(@Valid的变体);
@Valid支持级联校验、@Validate不支持级联校验。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。