最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

dubbo接口入?yún)⑿r?yàn)方式(validation)

 更新時(shí)間:2026年02月06日 15:17:40   作者:C_Knight  
本文詳細(xì)介紹了如何在Maven項(xiàng)目中配置Dubbo服務(wù)的全局Filter,使用com.alibaba.dubbo.rpc.Filter攔截器進(jìn)行參數(shù)校驗(yàn),具體步驟包括接口入?yún)⑴渲?、服?wù)端遠(yuǎn)程參數(shù)校驗(yàn)和消費(fèi)者本地參數(shù)校驗(yàn),確保數(shù)據(jù)傳輸和處理過(guò)程中的參數(shù)正確性和安全性

maven依賴(lài)

   <dependency>
     <groupId>javax.validation</groupId>
     <artifactId>validation-api</artifactId>
   </dependency>
   <dependency>
     <groupId>org.hibernate.validator</groupId>
     <artifactId>hibernate-validator</artifactId>
   </dependency>

接口入?yún)?/h2>
@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

攔截器代碼實(shí)現(xiàn)。

/**
 * 統(tǒng)一異常處理,如果存在沒(méi)有catch住的異常,統(tǒng)一在此處封裝成默認(rèn)未知錯(cuò)誤
 */
@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("請(qǐng)求參數(shù)不能為空");
                     }
                     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){
            //入?yún)⑿r?yàn)
            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()));
    }

    /**
     * 構(gòu)建SoaResponse對(duì)象
     */
    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開(kāi)啟入?yún)⑿r?yàn)

  • 服務(wù)端遠(yuǎn)程參數(shù)校驗(yàn)
    <dubbo:provider validation="true"/>
  • 消費(fèi)者本地參數(shù)校驗(yàn)
    <dubbo:consumer validation="true"/>

總結(jié)以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java 基本算法之歸并排序?qū)嵗a

    java 基本算法之歸并排序?qū)嵗a

    這篇文章主要介紹了java 基本算法之歸并排序?qū)嵗a的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 通過(guò)netty把百度地圖API獲取的地理位置從Android端發(fā)送到Java服務(wù)器端的操作方法

    通過(guò)netty把百度地圖API獲取的地理位置從Android端發(fā)送到Java服務(wù)器端的操作方法

    這篇文章主要介紹了通過(guò)netty把百度地圖API獲取的地理位置從Android端發(fā)送到Java服務(wù)器端,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • SpringBoot使用阿里OSS實(shí)現(xiàn)文件云存儲(chǔ)的方法

    SpringBoot使用阿里OSS實(shí)現(xiàn)文件云存儲(chǔ)的方法

    這篇文章主要介紹了SpringBoot使用阿里OSS實(shí)現(xiàn)文件云存儲(chǔ),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • spring boot集成rabbitmq的實(shí)例教程

    spring boot集成rabbitmq的實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于spring boot集成rabbitmq的相關(guān)資料,springboot集成RabbitMQ非常簡(jiǎn)單,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • java啟動(dòng)時(shí)自定義配置文件路徑,自定義log4j2.xml位置方式

    java啟動(dòng)時(shí)自定義配置文件路徑,自定義log4j2.xml位置方式

    這篇文章主要介紹了java啟動(dòng)時(shí)自定義配置文件路徑,自定義log4j2.xml位置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java分布式事務(wù)管理框架之Seata

    Java分布式事務(wù)管理框架之Seata

    這篇文章主要介紹了Java分布式事務(wù)框架Seata,分布式事務(wù)是指事務(wù)的參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點(diǎn)之上
    2022-07-07
  • Jmeter的接口測(cè)試詳細(xì)步驟并實(shí)現(xiàn)業(yè)務(wù)閉環(huán)

    Jmeter的接口測(cè)試詳細(xì)步驟并實(shí)現(xiàn)業(yè)務(wù)閉環(huán)

    這篇文章主要介紹了Jmeter的接口測(cè)試詳細(xì)步驟并實(shí)現(xiàn)業(yè)務(wù)閉環(huán),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • 配置化Feign接口動(dòng)態(tài)切換URL方式

    配置化Feign接口動(dòng)態(tài)切換URL方式

    本文介紹了在開(kāi)發(fā)、測(cè)試和生產(chǎn)環(huán)境中使用Feign接口時(shí),根據(jù)不同的環(huán)境動(dòng)態(tài)切換調(diào)用URL的方法,通過(guò)在不同環(huán)境的配置文件中配置URL,并實(shí)現(xiàn)一個(gè)Feign攔截器來(lái)讀取這些配置,從而實(shí)現(xiàn)URL的動(dòng)態(tài)切換,這種方法避免了引入過(guò)多步驟,同時(shí)也保證了不同環(huán)境下的URL正確調(diào)用
    2024-11-11
  • Java如何自定義異常打印非堆棧信息詳解

    Java如何自定義異常打印非堆棧信息詳解

    這篇文章主要給大家介紹了關(guān)于Java如何自定義異常打印非堆棧信息的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • JAVA中值類(lèi)型和引用類(lèi)型的區(qū)別

    JAVA中值類(lèi)型和引用類(lèi)型的區(qū)別

    在java開(kāi)發(fā)中經(jīng)常會(huì)遇到值類(lèi)型和引用類(lèi)型知識(shí),但是有很多朋友不清楚java中值類(lèi)型和引用類(lèi)型的區(qū)別,今天小編通過(guò)本文給大家介紹下
    2017-02-02

最新評(píng)論

塔城市| 平罗县| 南投市| 元阳县| 澄迈县| 桦甸市| 随州市| 娄烦县| 临颍县| 田林县| 黔东| 水城县| 芜湖县| 嘉义市| 苍山县| 武鸣县| 绥中县| 横峰县| 奉节县| 渭南市| 永年县| 高雄县| 大冶市| 望奎县| 大名县| 韩城市| 安远县| 海淀区| 新化县| 浮梁县| 叶城县| 瑞昌市| 新泰市| 朝阳市| 岳普湖县| 交城县| 马龙县| 襄汾县| 延津县| 崇义县| 兴和县|