グローバルspringbootプロセスは統一に戻ります

グローバルspringbootプロセスは統一に戻ります

簡単な紹介

RESTスタイルの開発では、通常はフロントデスク成功した場合、戻り情報とステータスコードを知らせないようにします。ここでは、通常のリターンくださいutil:のような、パッケージング処理がResult含まれている同様のクラス、succcodemsgdataおよびその他の分野。

インターフェイスの呼び出しは、次のように返されます。

{
  "succ": false,        // 是否成功
  "ts": 1566467628851,  // 时间戳
  "data": null,         // 数据
  "code": "CLOUD800",   // 错误类型
  "msg": "业务异常",    // 错误描述
  "fail": true
}

もちろん、中に各インターフェイスによって返されるResult一緒に結合された技術およびビジネスクラスコードにつながるパッケージに関する情報への工具等。

次のようなインターフェイスのコール処理:

  @GetMapping("hello")
  public Result list(){
    return Result.ofSuccess("hello");
  }

結果:

{
  "succ": ture,         // 是否成功
  "ts": 1566467628851,  // 时间戳
  "data": "hello",      // 数据
  "code": null,         // 错误类型
  "msg": null,          // 错误描述
  "fail": true
}

私たちは、共通の外に動作してこれらを参照してstarter、各サービスは、頼りに1つの傍受統一作業プロセス、技術的なデカップリングを行うことができますパッケージ。

コンフィギュレーション

統一-処分-springbootスターター

このモジュールは、グローバルなエラー処理が含まれており、以下、パッケージング機能を返します。

次のように完全なディレクトリ構造は次のとおりです。

├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── purgetiem
│   │   │           └── starter
│   │   │               └── dispose
│   │   │                   ├── GlobalDefaultConfiguration.java
│   │   │                   ├── GlobalDefaultProperties.java
│   │   │                   ├── Interceptors.java
│   │   │                   ├── Result.java
│   │   │                   ├── advice
│   │   │                   │   └── CommonResponseDataAdvice.java
│   │   │                   ├── annotation
│   │   │                   │   ├── EnableGlobalDispose.java
│   │   │                   │   └── IgnorReponseAdvice.java
│   │   │                   └── exception
│   │   │                       ├── GlobalDefaultExceptionHandler.java
│   │   │                       ├── category
│   │   │                       │   └── BusinessException.java
│   │   │                       └── error
│   │   │                           ├── CommonErrorCode.java
│   │   │                           └── details
│   │   │                               └── BusinessErrorCode.java
│   │   └── resources
│   │       ├── META-INF
│   │       │   └── spring.factories
│   │       └── dispose.properties
│   └── test
│       └── java

統一復帰処理

一般的なパターンとして、我々は、パッケージ戻りオブジェクトと同様に扱うことができるユーティリティクラスを作成する必要があります。

結果(クラスを返します):

作成Result<T> Tのためのdataデータ型、このクラスはフィールドの一般的なフロントエンドが含まれている、いくつかの一般的に使用される静的初期化があるResultオブジェクトのメソッド。

/**
 * 返回统一数据结构
 *
 * @author purgeyao
 * @since 1.0
 */
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> implements Serializable {

  /**
   * 是否成功
   */
  private Boolean succ;

  /**
   * 服务器当前时间戳
   */
  private Long ts = System.currentTimeMillis();

  /**
   * 成功数据
   */
  private T data;

  /**
   * 错误码
   */
  private String code;

  /**
   * 错误描述
   */
  private String msg;

  public static Result ofSuccess() {
    Result result = new Result();
    result.succ = true;
    return result;
  }

  public static Result ofSuccess(Object data) {
    Result result = new Result();
    result.succ = true;
    result.setData(data);
    return result;
  }

  public static Result ofFail(String code, String msg) {
    Result result = new Result();
    result.succ = false;
    result.code = code;
    result.msg = msg;
    return result;
  }

  public static Result ofFail(String code, String msg, Object data) {
    Result result = new Result();
    result.succ = false;
    result.code = code;
    result.msg = msg;
    result.setData(data);
    return result;
  }

  public static Result ofFail(CommonErrorCode resultEnum) {
    Result result = new Result();
    result.succ = false;
    result.code = resultEnum.getCode();
    result.msg = resultEnum.getMessage();
    return result;
  }

  /**
   * 获取 json
   */
  public String buildResultJson(){
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("succ", this.succ);
    jsonObject.put("code", this.code);
    jsonObject.put("ts", this.ts);
    jsonObject.put("msg", this.msg);
    jsonObject.put("data", this.data);
    return JSON.toJSONString(jsonObject, SerializerFeature.DisableCircularReferenceDetect);
  }
}

復帰プロセスの一般的なニーズを満たすように持つことは、あなたはこのインタフェースを使用することができます。

  @GetMapping("hello")
  public Result list(){
    return Result.ofSuccess("hello");
  }

もちろん、これはあなたが呼び出す必要が連結され、毎回の使用であるResult包装方法で。


ResponseBodyAdvice 統一された遮断復帰処理

ResponseBodyAdviceメッセージ本体に新たに追加されたインターフェースでスプリング4.1は、HttpMessageConverter以前に許可書き込まController@ResponseBody変更または方法ResponseEntityいくつかの処理に戻るを行うなど、応答の内容を調整します。

ResponseBodyAdviceこれは、この方法における2つのインターフェースの合計が含まれてい

  • supports:選択したタイプのコンポーネントサポート所与コントローラとメソッドの戻り型{@code HttpMessageConverter}

  • beforeBodyWrite:その書き込み方法の前に呼び出さセレクトコール{@code HttpMessageConverter}、後。

その後、我々はこれらの2つの方法でいくつかの手と足を行うことができます。

  • supports治療が行われる必要があるかどうかを決定するために。

  • beforeBodyWrite返却処理を行うために使用。

CommonResponseDataAdviceクラスが実装してResponseBodyAdvice2つのメソッドを。

filter(MethodParameter methodParameter) 決意でプライベートメソッドかどうかを、統一プロセスを傍受するために戻ります。

以下のような:

  • カスタム注釈を追加@IgnorReponseAdvice無視傍受を。
  • いくつかのクラスを分析することはインターセプトしません。
  • いくつかのパッケージが傍受していないすべてのクラスを分析します。パッケージに傍受を無視するためのインタフェース。swaggerspringfox.documentation

フィルター方法:
偽のプロセスを傍受する必要がないと判断されます。

  private Boolean filter(MethodParameter methodParameter) {
    Class<?> declaringClass = methodParameter.getDeclaringClass();
    // 检查过滤包路径
    long count = globalDefaultProperties.getAdviceFilterPackage().stream()
        .filter(l -> declaringClass.getName().contains(l)).count();
    if (count > 0) {
      return false;
    }
    // 检查<类>过滤列表
    if (globalDefaultProperties.getAdviceFilterClass().contains(declaringClass.getName())) {
      return false;
    }
    // 检查注解是否存在
    if (methodParameter.getDeclaringClass().isAnnotationPresent(IgnorReponseAdvice.class)) {
      return false;
    }
    if (methodParameter.getMethod().isAnnotationPresent(IgnorReponseAdvice.class)) {
      return false;
    }
    return true;
  }

CommonResponseDataAdvice类:

中心にbeforeBodyWrite取り扱いの方法。

  1. 決定Object oするかどうかnullのために、null構造Resultの目標リターンのために。
  2. 決定Object oするかどうかをResultリターンがこの場合に、インターフェースが作成されてもよい、サブクラス自体又はResult、再度パッケージを回避するために、判定されたResultサブクラス自体又はリターンObject o自体。
  3. 決定するObject oようにそれがあるかどうかをString検査する過程で見つかったStringことがある場合に、判定動作を行った特別な場合、String実行するためJSON.toJSON(Result.ofSuccess(o)).toString()の操作のシリアル番号。
  4. その他のデフォルトのリターン・Result.ofSuccess(o)包装工程。
/**
 * {@link IgnorReponseAdvice} 处理解析 {@link ResponseBodyAdvice} 统一返回包装器
 *
 * @author purgeyao
 * @since 1.0
 */
@RestControllerAdvice
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> {

  private GlobalDefaultProperties globalDefaultProperties;

  public CommonResponseDataAdvice(GlobalDefaultProperties globalDefaultProperties) {
    this.globalDefaultProperties = globalDefaultProperties;
  }

  @Override
  @SuppressWarnings("all")
  public boolean supports(MethodParameter methodParameter,
      Class<? extends HttpMessageConverter<?>> aClass) {
    return filter(methodParameter);
  }

  @Nullable
  @Override
  @SuppressWarnings("all")
  public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType,
      Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
      ServerHttpResponse serverHttpResponse) {

    // o is null -> return response
    if (o == null) {
      return Result.ofSuccess();
    }
    // o is instanceof ConmmonResponse -> return o
    if (o instanceof Result) {
      return (Result<Object>) o;
    }
    // string 特殊处理
    if (o instanceof String) {
      return JSON.toJSON(Result.ofSuccess(o)).toString();
    }
    return Result.ofSuccess(o);
  }

  private Boolean filter(MethodParameter methodParameter) {
    ···略
  }

}

だから、基本的に処理コアを完了しました。もちろん、の短い上記@IgnorReponseAdviceの注釈。

@IgnorReponseAdvice
ちょうどロゴの役割として、ポイント比較的簡単。

/**
 * 统一返回包装标识注解
 *
 * @author purgeyao
 * @since 1.0
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnorReponseAdvice {

}

春のコンテナに参加

最後に、GlobalDefaultExceptionHandlerbean的注入springコンテナ。

@Configuration
@EnableConfigurationProperties(GlobalDefaultProperties.class)
@PropertySource(value = "classpath:dispose.properties", encoding = "UTF-8")
public class GlobalDefaultConfiguration {

  ···略
  
  @Bean
  public CommonResponseDataAdvice commonResponseDataAdvice(GlobalDefaultProperties globalDefaultProperties){
    return new CommonResponseDataAdvice(globalDefaultProperties);
  }

}

でしょうGlobalDefaultConfigurationresources/META-INF/spring.factories負荷次のファイル。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.purgetime.starter.dispose.GlobalDefaultConfiguration

しかし、我々は、注釈モードを使用して、この時間はオンになっています。他のプロジェクトの依存関係の後、あなたは追加する必要がある@EnableGlobalDispose唯一のグローバル傍受機能をオンにすることができます。

作成したばかりのspring.factories作成、コメントEnableGlobalDisposeのメモを。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(GlobalDefaultConfiguration.class)
public @interface EnableGlobalDispose {

}

使用するインポートが可能。@ImportGlobalDefaultConfiguration

使用

依存追加

<dependency>
  <groupId>io.deepblueai</groupId>
  <artifactId>unified-dispose-deepblueai-starter</artifactId>
  <version>0.1.0.RELEASE</version>
</dependency>

開始オープンクラスの@EnableGlobalDisposeノートは、することができます。

  1. 業務用

インタフェース:

@GetMapping("test")
public String test(){
  return "test";
}

リターン

{
  "succ": true,             // 是否成功
  "ts": 1566386951005,      // 时间戳
  "data": "test",           // 数据
  "code": null,             // 错误类型
  "msg": null,              // 错误描述
  "fail": false             
}
  1. @IgnorReponseAdvice:パッケージの注意事項を無視

@IgnorReponseAdvice許容範囲は次のとおりです。+クラスメソッドは、言ったクラスの識別子は、クラスメソッドが返されたパッケージは無視され返しています。

インタフェース:

@IgnorReponseAdvice // 忽略数据包装 可添加到类、方法上
@GetMapping("test")
public String test(){
  return "test";
}

リターン test

概要

重複したコードの多くでのプロジェクトは、開発の量を減らすの特定の目的を達成するためにいくつかの簡単な方法を通過することができます。

サンプルコード住所:統一-廃棄-springboot

GitHubの上:
Purgeyaoは注意を歓迎します

おすすめ

転載: www.cnblogs.com/Purgeyao/p/11599810.html