国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[Spring cloud 一步步實現廣告系統] 4. 通用代碼模塊設計

since1986 / 2748人閱讀

摘要:對的配置和行為進行定制修改匹配路由請求規則注冊自定義的和添加靜態資源處理器添加自定義視圖控制器添加自定義方法參數處理器配置消息轉換器清空所有轉換器做一個好人。博客園掘金簡書頭條知乎

一個大的系統,在代碼的復用肯定是必不可少的,它能解決:

統一的響應處理(可以對外提供統一的響應對象包裝)

統一的異常處理(可以將業務異常統一收集處理)

通用代碼定義、配置定義(通用的配置信息放在統一的代碼管理中,便于維護和更新)

創建項目 mscx-ad-common
POM文件


    
        mscx-ad
        com.sxzhongf
        1.0-SNAPSHOT
        ../pom.xml
    
    4.0.0
    jar

    com.sxzhongf
    mscx-ad-common
    1.0-SNAPSHOT
    Common-Service
    公共邏輯 and 幫助類

    
        
            org.springframework.boot
            spring-boot-starter-web
        
          
        
            com.alibaba
            fastjson
            1.2.58
        
          
        
            commons-codec
            commons-codec
        
        
            org.apache.commons
            commons-lang3
        
    
        
    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    
項目結構

vo (統一響應對象package)

advice (bean 增強package )

Spring支持五種類型的增強或通知(Advice)

Before(方法執行前) org.apringframework.aop.MethodBeforeAdvice

AfterReturning(方法返回后) org.springframework.aop.AfterReturningAdvice

After-throwing(異常拋出后) org.springframework.aop.ThrowsAdviceArround環繞,即方法前后 org.aopaliance.intercept.MethodInterceptor
引介,不常用 org.springframework.aop.IntroductionInterceptor

具體可參考:細說advice,advisor

annotation

config

exception

utils

export

通用響應編碼

創建通用返回對象

/**
* @Data是下屬注解的組合注解
* 
* @see Getter
* @see Setter
* @see RequiredArgsConstructor
* @see ToString
* @see EqualsAndHashCode
* @see lombok.Value 
*/
@Data
@NoArgsConstructor //無參構造函數
@AllArgsConstructor //全參構造函數
public class CommonResponse implements Serializable {
   private Integer code = 0;
   private String message = "success";
   /**
    * 具體的數據對象信息
    */
   private T data;

   public CommonResponse(Integer code, String message) {
       this.code = code;
       this.message = message;
   }

   public CommonResponse(T data) {
       this.data = data;
   }
}

在advice包中實現對響應的統一攔截com.sxzhongf.ad.common.advice.CommonResponseDataAdvice,參考 ResponseBodyAdvice, RestControllerAdvice 可查看源碼org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice

   @RestControllerAdvice
   public class CommonResponseDataAdvice implements ResponseBodyAdvice {
   
       /**
        * 判斷是否需要對響應進行處理
        *
        * @return false -> 不處理,true -> 處理
        */
       @Override
       public boolean supports(MethodParameter methodParameter, Class> converterType) {
   //
   //        //獲取當前處理請求的controller的方法
   //        String methodName = methodParameter.getMethod().getName().toLowerCase();
   //        // 不攔截/不需要處理返回值 的方法
   //        String method = "login"; //如登錄
   //        //不攔截
   //        return !method.equals(methodName);
   
           // 如果類上標記了@IgnoreResponseAdvice,則不攔截
           if (methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreResponseAdvice.class)) {
               return false;
           }
   
           // 如果方法上標記了@IgnoreResponseAdvice,則不攔截
           if (methodParameter.getMethod().isAnnotationPresent(IgnoreResponseAdvice.class)) {
               return false;
           }
   
           //對響應進行處理,執行beforeBodyWrite方法
           return true;
       }
   
       /**
        * 目的 攔截CommonResponse
        *
        * @param body 原始的Controller需要返回的數據
        */
       @Override
       public Object beforeBodyWrite(Object body, MethodParameter returnType,
                                     MediaType selectedContentType,
                                     Class> selectedConverterType,
                                     ServerHttpRequest request,
                                     ServerHttpResponse response) {
   
           CommonResponse commonResponse = new CommonResponse<>();
   
           if (null == body) {
               return commonResponse;
           } else if (body instanceof CommonResponse) {
               commonResponse = (CommonResponse) body;
           } else {
               commonResponse.setData(body);
           }
           return commonResponse;
       }
   }

我們在annotation包下面添加一個注解com.sxzhongf.ad.common.annotation.IgnoreResponseAdvice,用它來標柱是否需要支持上面的統一返回攔截。

   /**
    * IgnoreResponseAdvice for 標示需要忽略攔截動作
    *
    * @author Isaac.Zhang
    */
   //ElementType.TYPE 表示該注解可用于class
   //ElementType.METHOD 表示可用于方法
   @Target({ElementType.TYPE, ElementType.METHOD})
   @Retention(RetentionPolicy.RUNTIME)
   public @interface IgnoreResponseAdvice {
   }
通用異常處理
異常處理也是統一的,那么同樣就要使用到RestControllerAdvice,同時,需要使用的Spring 的ExceptionHandler進行異常處理

創建統一異常攔截類

/**
 * GlobalExceptionAdvice for 全局統一異常攔截
 *
 * @author Isaac.Zhang
 * @see RestControllerAdvice
 * @see ExceptionHandler
 */
@RestControllerAdvice
public class GlobalExceptionAdvice {

    /**
     * 對 {@link AdException} 進行統一處理
     * {@link ExceptionHandler}  對指定的異常進行攔截
     * 可優化:
     * 定義多種類異常,實現對應的異常處理,
     * 例如:
     * 
    *
  • * 推廣單元操作異常,拋出 AdUnitException *
  • *
  • * Binlog 解析異常,拋出 BinlogException *
  • *
* 攔截Spring Exception 使用 {@link ExceptionHandler}注解 */ @ExceptionHandler(value = AdException.class) public CommonResponse handlerAdException(HttpServletRequest request, AdException ex) { CommonResponse response = new CommonResponse<>(-1, "business error"); response.setData(ex.getMessage()); return response; } }

2.創建通用異常類

/**
 * AdException for 統一異常處理類
 *
 * @author Isaac.Zhang
 */
public class AdException extends Exception {
    public AdException(String message) {
        super(message);
    }
}
通用配置信息

通過HTTP消息轉換器HttpMessageConverter,實現對象轉換,Java Object -> HTTP 數據流

新增WebConfiguration,我們通過實現org.springframework.web.servlet.config.annotation.WebMvcConfigurer來定制和修改Spring MVC的配置信息。

/**
 * WebConfiguration for 對Spring的配置和行為進行定制修改
 *
 * @author Isaac.Zhang
 * @see WebMvcConfigurer
 */
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
    /**
     * 匹配路由請求規則
     */
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {

    }
    /**
     * 注冊自定義的Formatter 和 Convert
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {

    }
    /**
     * 添加靜態資源處理器
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

    }
    /**
     * 添加自定義視圖控制器
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {

    }
    /**
     * 添加自定義方法參數處理器
     */
    @Override
    public void addArgumentResolvers(List resolvers) {

    }
    /**
     * 配置消息轉換器
     */
    @Override
    public void configureMessageConverters(List> converters) {
        //清空所有轉換器
        converters.clear();
          // Java Obj -> Json Obj (http header: application/json)
        converters.add(new MappingJackson2HttpMessageConverter());
    }
}
做一個好人。

博客園 | segmentfault | spring4all | csdn | 掘金 | OSChina | 簡書 | 頭條 | 知乎 | 51CTO

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75604.html

相關文章

  • [Spring cloud 步步實現廣告系統] 7. 中期總結回顧

    摘要:在前面的過程中,我們創建了個服務發現我們使用作為服務發現組件,學習了的使用。加依賴加注解改配置使用項目三部曲,我們可以快速添加一個新組件,并正常使用這個我沒有在項目中實現,但是大家可以和一樣,三部曲搞定。 在前面的過程中,我們創建了4個project: 服務發現 我們使用Eureka 作為服務發現組件,學習了Eureka Server,Eureka Client的使用。 Eureka...

    cnsworder 評論0 收藏0
  • [Spring cloud 步步實現廣告系統] 12. 廣告索引介紹

    摘要:索引設計介紹在我們廣告系統中,為了我們能更快的拿到我們想要的廣告數據,我們需要對廣告數據添加類似于數據庫一樣的索引結構,分兩大類正向索引和倒排索引。如何在廣告系統中使用倒排索引核心用途是對各個維度限制的整理。 索引設計介紹 在我們廣告系統中,為了我們能更快的拿到我們想要的廣告數據,我們需要對廣告數據添加類似于數據庫index一樣的索引結構,分兩大類:正向索引和倒排索引。 正向索引 通過...

    endless_road 評論0 收藏0
  • [Spring cloud 步步實現廣告系統] 14. 全量索引代碼實現

    摘要:各個表數據的存儲文件名定義索引對象導出的字段信息依然用為例。通用處理索引類索引之間存在層級劃分,也就是相互之間擁有依賴關系的劃分加載全量索引其實是增量索引添加的一種特殊實現若初實現廣告推廣計劃的第二層級索引實現。 上一節我們實現了索引基本操作的類以及索引緩存工具類,本小節我們開始實現加載全量索引數據,在加載全量索引數據之前,我們需要先將數據庫中的表數據導出到一份文件中。Lets cod...

    MycLambert 評論0 收藏0
  • [Spring cloud 步步實現廣告系統] 6. Service實現&Zuul配置&a

    摘要:所以,沒必要過分糾結這種信息,咬文嚼字有時候反而會適得其反。若初通用錯誤信息異常類請求參數異常用戶已存在用戶不存在在下面創建一個工具類用來對用戶進行加密來獲取信息。工具類若初加密參考創建用戶的實現,依次實現其他表操作。 DAO層設計實現 這里我們使用Spring DATA JPA來實現數據庫操作,當然大家也可以使用Mybatis,都是一樣的,我們依然以用戶表操作為例: /** * A...

    孫淑建 評論0 收藏0
  • [Spring cloud 步步實現廣告系統] 8. 檢索系統配置&依賴

    摘要:工作流程項目依賴監控面板引入服務調用的組件依賴引入服務消費者的依賴數據庫鏈接依賴工具類集合類操作日志監聽解析開源工具類庫中的配置相關依賴圖片壓縮 工作流程 showImg(https://i.loli.net/2019/07/29/5d3ee1829df4d57461.png); 項目依賴 org.springframewo...

    dailybird 評論0 收藏0

發表評論

0條評論

since1986

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<