Dubbo -- 系统学习 笔记 -- 示例 -- 参数验证
Dubbo -- 系统学习 笔记 -- 目录
示例
想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式
参数验证
参数验证功能是基于JSR303实现的,用户只需标识JSR303标准的验证Annotation,并通过声明filter来实现验证。
2.1.0以上版本支持
验证方式可扩展,参见:Validation扩展点
参数标注示例:
import java.io.Serializable; import java.util.Date;import javax.validation.constraints.Future; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Past; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size;public class ValidationParameter implements Serializable {private static final long serialVersionUID = 7158911668568000392L;@NotNull // 不允许为空@Size(min = 1, max = 20) // 长度或大小范围private String name;@NotNull(groups = ValidationService.Save.class) // 保存时不允许为空,更新时允许为空 ,表示不更新该字段@Pattern(regexp = "^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$")private String email;@Min(18) // 最小值@Max(100) // 最大值private int age;@Past // 必须为一个过去的时间private Date loginDate;@Future // 必须为一个未来的时间private Date expiryDate;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Date getLoginDate() {return loginDate;}public void setLoginDate(Date loginDate) {this.loginDate = loginDate;}public Date getExpiryDate() {return expiryDate;}public void setExpiryDate(Date expiryDate) {this.expiryDate = expiryDate;}}
分组验证示例:
public interface ValidationService { // 缺省可按服务接口区分验证场景,如:@NotNull(groups = ValidationService.class) @interface Save{} // 与方法同名接口,首字母大写,用于区分验证场景,如:@NotNull(groups = ValidationService.Save.class),可选void save(ValidationParameter parameter);void update(ValidationParameter parameter);}
关联验证示例:
import javax.validation.GroupSequence;public interface ValidationService {@GroupSequence(Update.class) // 同时验证Update组规则@interface Save{}void save(ValidationParameter parameter);@interface Update{} void update(ValidationParameter parameter);}
参数验证示例:
import javax.validation.constraints.Min; import javax.validation.constraints.NotNull;public interface ValidationService {void save(@NotNull ValidationParameter parameter); // 验证参数不为空 void delete(@Min(1) int id); // 直接对基本类型参数验证 }
在客户端验证参数:
<dubbo:reference id="validationService" interface="com.alibaba.dubbo.examples.validation.api.ValidationService" validation="true" />
在服务器端验证参数:
<dubbo:service interface="com.alibaba.dubbo.examples.validation.api.ValidationService" ref="validationService" validation="true" />
验证异常信息:
import javax.validation.ConstraintViolationException; import javax.validation.ConstraintViolationException;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.alibaba.dubbo.examples.validation.api.ValidationParameter; import com.alibaba.dubbo.examples.validation.api.ValidationService; import com.alibaba.dubbo.rpc.RpcException;public class ValidationConsumer {public static void main(String[] args) throws Exception {String config = ValidationConsumer.class.getPackage().getName().replace('.', '/') + "/validation-consumer.xml";ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);context.start();ValidationService validationService = (ValidationService)context.getBean("validationService");// Errortry {parameter = new ValidationParameter();validationService.save(parameter);System.out.println("Validation ERROR");} catch (RpcException e) { // 抛出的是RpcExceptionConstraintViolationException ve = (ConstraintViolationException) e.getCause(); // 里面嵌了一个ConstraintViolationExceptionSet<ConstraintViolation<?>> violations = ve.getConstraintViolations(); // 可以拿到一个验证错误详细信息的集合 System.out.println(violations);}}}
需要加入依赖:
<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.0.0.GA</version> </dependency> <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.2.0.Final</version> </dependency>
啦啦啦
Dubbo -- 系统学习 笔记 -- 示例 -- 参数验证相关推荐
- Dubbo -- 系统学习 笔记 -- 示例 -- 服务分组
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 服务分组 当一个接口有多种实现时,可以用group区分. <dubbo:se ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 只订阅
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 只订阅 问题 为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如 ...
- Dubbo -- 系统学习 笔记 -- 目录
用户指南 入门 背景 需求 架构 用法 快速启动 服务提供者 服务消费者 依赖 必需依赖 缺省依赖 可选依赖 成熟度 功能成熟度 策略成熟度 配置 Xml配置 属性配置 注解配置 API配置 示例 启 ...
- django系统学习笔记
转自:http://hi.baidu.com/derris/item/7ca6013e330563fede2221ab 2010-02-07 00:12 django系统学习笔记--(1)hello ...
- React系统学习笔记
***当前阶段的笔记 *** 「面向实习生阶段」https://www.aliyundrive.com/s/VTME123M4T9 提取码: 8s6v 点击链接保存,或者复制本段内容,打开「阿里云盘」 ...
- linux系统学习笔记9——CANOpen状态转换
CANopen CANopen状态转换 CANopen状态转换 从节点上电和内部初始化之后自动进入预损作状太(Pre-operational State),在进入预操作之前,发送标准的启动对象(Boo ...
- dubbo入门学习笔记之入门demo(基于普通maven项目)
注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...
- 数字IC设计学习笔记_Formality 形式验证
数字IC设计学习笔记 Formality 形式验证 1. 基本特点 2. Reference Design 和Implementation Design 3. container 4. 读入共享技术库 ...
- 【六更完结!由于字数限制开新文章继续】零基础信号与系统学习笔记:复指数信号、傅里叶级数的系数推导、三角函数正交性、离散傅里叶变换、相位补偿、z变换表、逆变换表、常见序列及其作用
零基础信号与系统学习笔记:复指数信号.傅里叶变换.三角函数正交性 基础1:复指数信号 复指数信号基础知识 复指数信号推导1 虚指数信号 虚指数信号特性和作用 直流信号 基础2:傅里叶级数 推导傅里叶级 ...
最新文章
- 第三期 OSI七层中第一层 物理层
- 半导体制冷器性能计算
- ArtVideoPlayer:一个灵活的视频播放器
- mos 多路模拟电子开关_【原创】单火线智能开关技术介绍及分析
- (转)Javascript 面向对象编程(一):封装
- 深度学习之对象检测_深度学习时代您应该阅读的12篇文章,以了解对象检测
- 分布式事务最终一致性-CAP框架轻松搞定
- markdown 图片居中_Markdown入门指南【我为什么要推荐你学习Markdown?】
- scala中的数组的转换操作
- 服务器被入侵怎么办,如何预防
- 百度网盘限速解决方案
- 阿里云宝塔apache启动失败解决办法
- 通过GitHub和GoDaddy搭建静态个人博客
- Linux 锁机制(3)之自旋锁
- android+高德地图教程,Android高德地图开发(三)地图简单操作
- 数据可视化优秀作品欣赏
- Android P 中的网络安全配置指南 network-security-config
- 微信小程序Vant Weapp里面Calendar 日历组件不显示的问题
- Arduino串口控制DY-SV5W音频播放
- 下载delphi 5 至 delphi 2010