dubbo接口入参校验方式(validation)
更新时间:2026年02月06日 15:17:40 作者:C_Knight
本文详细介绍了如何在Maven项目中配置Dubbo服务的全局Filter,使用com.alibaba.dubbo.rpc.Filter拦截器进行参数校验,具体步骤包括接口入参配置、服务端远程参数校验和消费者本地参数校验,确保数据传输和处理过程中的参数正确性和安全性
maven依赖
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
接口入参
@Data
public class UpdateBizLimitReqDTO {
private static final long serialVersionUID = 3217106310804365294L;
@NotNull(
message = "UpdateBizLimitReqDTO.ticket not null"
)
private String ticket;
@NotNull(
message = "UpdateBizLimitReqDTO.bizId not null"
)
private Long bizId;
@NotNull(
message = "UpdateBizLimitReqDTO.source not null"
)
private Integer source;
@NotNull(
message = "UpdateBizLimitReqDTO.limitItemList not null"
)
}
配置全局Filter
- 配置com.alibaba.dubbo.rpc.Filter文件
exceptionResolver=com.*.*.MPExceptionReslover

拦截器代码实现。
/**
* 统一异常处理,如果存在没有catch住的异常,统一在此处封装成默认未知错误
*/
@Slf4j
@Activate(
group = {"provider", "consumer"}
)
public class MPExceptionReslover implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) {
try{
Object [] args = invocation.getArguments();
if(args != null && args.length != 0){
for (int i = 0; i < args.length; i++) {
if(args[i] == null){
throw new BizValidatorException("请求参数不能为空");
}
RequestValidator validator = ValidatorFactory.getValidator(args[i].getClass());
if(validator != null){
validator.doValidate(args[i]);
}
}
}
Result result = invoker.invoke(invocation);
Throwable exception = result.getException();
if (exception != null) {
return wrapException(result.getException());
} else {
return result;
}
}catch (Exception e){
return wrapException(e);
}
}
private RpcResult wrapException(Throwable exception) {
if(exception instanceof BizException){
BizException bizException = (BizException) exception;
return new RpcResult(soaResponse(bizException.getErrorCode(), bizException.getErrorMsg()));
}else if(exception instanceof RpcException){
//入参校验
RpcException rpcException = (RpcException)exception;
if(rpcException.getCause() instanceof ConstraintViolationException){
ConstraintViolationException violationException = (ConstraintViolationException)rpcException.getCause();
Set<ConstraintViolation<?>> errReason = violationException.getConstraintViolations();
for (ConstraintViolation<?> item : errReason) {
return new RpcResult(soaResponse(PromotionErrorCode.FAIL_PARAM_NULL.getErrorCode(), item.getMessageTemplate()));
}
}
}
return new RpcResult(soaResponse("999999", exception.getMessage()));
}
/**
* 构建SoaResponse对象
*/
private SoaResponse<Void, Void> soaResponse(String returnCode, String errorMsg) {
SoaResponse<Void, Void> soaResponse = new SoaResponse<>();
soaResponse.setResponseVo(null);
soaResponse.setErrT(null);
soaResponse.setReturnCode(returnCode);
soaResponse.setReturnMsg(errorMsg);
soaResponse.setProcessResult(Boolean.FALSE);
return soaResponse;
}
}
dubbo开启入参校验
- 服务端远程参数校验
<dubbo:provider validation="true"/>
- 消费者本地参数校验
<dubbo:consumer validation="true"/>
总结以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot Admin集成诊断利器Arthas示例实现
这篇文章主要为大家介绍了SpringBoot Admin集成诊断利器Arthas示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-06-06
Spring Security Oauth2.0认证授权教程
Spring Security实现用户认证、会话管理及授权,支持Token等多方式,OAuth2.0用于分布式系统统一认证,网关解析令牌并转发请求2025-07-07
java线程安全锁ReentrantReadWriteLock原理分析readLock
这篇文章主要为大家介绍了java线程安全锁ReentrantReadWriteLock原理分析readLock,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-10-10
Java Spring @Autowired的这些骚操作,你都知道吗
这篇文章主要介绍了彻底搞明白Spring中的自动装配和Autowired注解的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2021-09-09


最新评论