栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

dubbo之参数验证

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

dubbo之参数验证

写在前面

本文在这篇文章 基础上改造进行测试。

dubbo的参数验证基于JSR303规范就是定义了校验注解,错误信息如何提示等的规范,我们只需要使用规定的注解,并声明Filter就可以了。
源码。

1:改造rpc-service-api 1.1:引入依赖

    
    
    
        javax.validation
        validation-api
        2.0.1.Final
    
    
    
        org.hibernate.validator
        hibernate-validator
        6.0.18.Final
    
    
    
        org.glassfish
        javax.el
        3.0.1-b11
    

1.2:UserAddDTO
public class UserAddDTO implements Serializable {
    
    @NotEmpty(message = "昵称不能为空")
    @Length(min = 5, max = 16, message = "账号长度为 5-16 位")
    private String name;
    
    @NotNull(message = "性别不能为空")
    private Integer gender;

    // getter setter tostring
}
1.3:UserRpcService
public interface UserRpcService {

    
    UserDTO get(@NotNull(message = "用户编号不能为空") Integer id)
            throws ConstraintViolationException;

    
    Integer add(UserAddDTO addDTO)
            throws ConstraintViolationException;
}

注意在方法中抛出ConstraintViolationException的原因是参数校验不通过时会抛出该异常,所以这里抛出提供给用户查看错误信息。

2:改造rpc-service-provider 2.1:UserRpcServiceImpl
@Service
public class UserRpcServiceImpl implements UserRpcService {

    @Override
    public UserDTO get(Integer id) {
        
        UserDTO userDTO = new UserDTO();
        userDTO.setId(id);
        userDTO.setName("没有昵称:" + id);
        userDTO.setGender(id % 2 + 1);
        return userDTO;
    }

    @Override
    public Integer add(UserAddDTO addDTO) {
        return (int) (System.currentTimeMillis() / 1000); // 嘿嘿,随便返回一个 id
    }

}
2.2:dubbo.xml

增加了validation="true"开启服务提供者端的参数校验,如果是参数校验不通过则抛出ConstraintViolationException。

可以通过在application.yml中配置dubbo.provider.validation = true开启服务提供者所有service的参数校验。

3:改造rpc-service-consumer 3.1:dubbo.xml

通过validation="true"开启服务消费者的参数校验。

3.2:触发异常执行类
@Component
public class UserRpcServiceTest02 implements CommandLineRunner {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Resource
    private UserRpcService userRpcService;

    @Override
    public void run(String... args) throws Exception {
        // 获得用户
        try {
            // 发起调用
            UserDTO user = userRpcService.get(null); // 故意传入空的编号,为了校验编号不通过
            logger.info("[run][发起一次 Dubbo RPC 请求,获得用户为({})]", user);
        } catch (Exception e) {
            logger.error("[run][获得用户发生异常,信息为:[{}]", e.getMessage());
        }

        // 添加用户
        try {
            // 创建 UserAddDTO
            UserAddDTO addDTO = new UserAddDTO();
            // 故意把名字打的特别长,为了校验名字不通过
            addDTO.setName("dongshidaddydongshidaddydongshidaddydongshidaddy");
            // 不传递性别,为了校验性别不通过
            addDTO.setGender(null);
            // 发起调用
            userRpcService.add(addDTO);
            logger.info("[run][发起一次 Dubbo RPC 请求,添加用户为({})]", addDTO);
        } catch (Exception e) {
            logger.error("[run][添加用户发生异常,信息为:[{}]", e.getMessage());
        }
    }

}
3.3:执行

如下红框中是错误执行触发的异常信息,蓝色框是正常的调用:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/458910.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号