如何使用SpringBoot和Dubbo结合Validation实现RPC参数校验?
- 内容介绍
- 文章标签
- 相关推荐
本文共计759个文字,预计阅读时间需要4分钟。
注意:本文档涉及dubbo版本2.8.4,springboot版本2.0.4.RELEASE,项目结构包括test-rest(前端消费层,Controller层,Spring Boot Maven项目)和test-api(dubbo服务API,记录Service接口和Model,Maven项目)。
注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE
项目结构
- test-rest (前端消费着,controller 层,springboot+maven项目)
- test-api (dubbo服务 的 api ,只记录 service 接口和 model ,maven 项目)
- test-provider(dubbo 服务提供者,实际的数据库操作及业务层, springboot+maven项目 )
背景:
使用springmvc做restful,使用dubbo做rpc,restful中调用大量的rpc,数据验证会在这两个地方,一个是restful层面,一个是rpc层面,restful层面使用springmvc默认的集成hibernate-validator来实现,参数开启验证只需要加入@Validated param。dubbo 使用 rpc 的校验
dubbo rpc层面采用的是JSR303标准注解验证,通过hibernate-validator实现,dubbo中开启validation也有两个方式,一个是在consumer端,一个是在provider`端。
开启dubbo 的服务端校验时,调用dubbo 的服务时会在服务端进行参数校验,如果在consumer 端也开启了校验则调用服务时也会在 consumer 端进行校验
dubbo 的rpc 校验 (服务端开启)
首先配置dobbo 的rpc 层校验
1.引入依赖,
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
2.在api 的model 上添加注解
import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; import java.io.Serializable; public class UserSaveArgs implements Serializable { private static final long serialVersionUID = -5457103531947646047L; @NotEmpty( message = "用户名不能为空") @Pattern(regexp = Constants.USERNAME_PATTERN, message = "用户名格式有误") private String userName; @NotEmpty( message = "手机号不能为空") @Pattern(regexp = Constants.PHONTE_NUMBER_PATTERN, message = "手机号编码格式有误") private String phoneNumber; @NotNull( message = "年龄不能为空") @Min(value = 0, message = "年龄不能小于0") private Integer age; //get set 省略
在dubbo 配置文件 provider.xml 中开启验证 validation=“true”
<dubbo:provider delay="-1" timeout="5000" threads="600" threadpool="fixed" loadbalance="roundrobin" accesslog="true" retries="0" validation="true"/>
消费端开启
由于消费端引入了服务端的api 所以在消费端开启校验时只需在consumer.xml 中开启验证即可 validation=“true”
consumer 端开启了校验则在调用服务时会在 consumer 端进行参数校验,不使用provider的资源进行校验
<dubbo:consumer check="false" timeout="60000" retries="0" validation="true"/>
配置自定义异常处理解析 rpc 校验异常
@ControllerAdvice public class DefaultExceptionHandler { @ExceptionHandler({RpcException.class}) @ResponseBody @ResponseStatus(HttpStatus.OK) public ResponseEntity RpcException(Exception ex, Model model) { logger.error("rpc接口参数校验异常。{}", ex.getMessage()); String errMsg = ((ConstraintViolationException) ex.getCause()).getConstraintViolations() .iterator().next().getMessage(); //ResponseEntity 为自定义的返回类,非springframework.www.jb51.net/article/170692.htm
www.jb51.net/article/155033.htm
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。
本文共计759个文字,预计阅读时间需要4分钟。
注意:本文档涉及dubbo版本2.8.4,springboot版本2.0.4.RELEASE,项目结构包括test-rest(前端消费层,Controller层,Spring Boot Maven项目)和test-api(dubbo服务API,记录Service接口和Model,Maven项目)。
注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE
项目结构
- test-rest (前端消费着,controller 层,springboot+maven项目)
- test-api (dubbo服务 的 api ,只记录 service 接口和 model ,maven 项目)
- test-provider(dubbo 服务提供者,实际的数据库操作及业务层, springboot+maven项目 )
背景:
使用springmvc做restful,使用dubbo做rpc,restful中调用大量的rpc,数据验证会在这两个地方,一个是restful层面,一个是rpc层面,restful层面使用springmvc默认的集成hibernate-validator来实现,参数开启验证只需要加入@Validated param。dubbo 使用 rpc 的校验
dubbo rpc层面采用的是JSR303标准注解验证,通过hibernate-validator实现,dubbo中开启validation也有两个方式,一个是在consumer端,一个是在provider`端。
开启dubbo 的服务端校验时,调用dubbo 的服务时会在服务端进行参数校验,如果在consumer 端也开启了校验则调用服务时也会在 consumer 端进行校验
dubbo 的rpc 校验 (服务端开启)
首先配置dobbo 的rpc 层校验
1.引入依赖,
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
2.在api 的model 上添加注解
import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; import java.io.Serializable; public class UserSaveArgs implements Serializable { private static final long serialVersionUID = -5457103531947646047L; @NotEmpty( message = "用户名不能为空") @Pattern(regexp = Constants.USERNAME_PATTERN, message = "用户名格式有误") private String userName; @NotEmpty( message = "手机号不能为空") @Pattern(regexp = Constants.PHONTE_NUMBER_PATTERN, message = "手机号编码格式有误") private String phoneNumber; @NotNull( message = "年龄不能为空") @Min(value = 0, message = "年龄不能小于0") private Integer age; //get set 省略
在dubbo 配置文件 provider.xml 中开启验证 validation=“true”
<dubbo:provider delay="-1" timeout="5000" threads="600" threadpool="fixed" loadbalance="roundrobin" accesslog="true" retries="0" validation="true"/>
消费端开启
由于消费端引入了服务端的api 所以在消费端开启校验时只需在consumer.xml 中开启验证即可 validation=“true”
consumer 端开启了校验则在调用服务时会在 consumer 端进行参数校验,不使用provider的资源进行校验
<dubbo:consumer check="false" timeout="60000" retries="0" validation="true"/>
配置自定义异常处理解析 rpc 校验异常
@ControllerAdvice public class DefaultExceptionHandler { @ExceptionHandler({RpcException.class}) @ResponseBody @ResponseStatus(HttpStatus.OK) public ResponseEntity RpcException(Exception ex, Model model) { logger.error("rpc接口参数校验异常。{}", ex.getMessage()); String errMsg = ((ConstraintViolationException) ex.getCause()).getConstraintViolations() .iterator().next().getMessage(); //ResponseEntity 为自定义的返回类,非springframework.www.jb51.net/article/170692.htm
www.jb51.net/article/155033.htm
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

