グローバルspringbootプロセスは統一に戻ります
簡単な紹介
RESTスタイルの開発では、通常はフロントデスク成功した場合、戻り情報とステータスコードを知らせないようにします。ここでは、通常のリターンくださいutil
:のような、パッケージング処理がResult
含まれている同様のクラス、succ
、code
、msg
、data
およびその他の分野。
インターフェイスの呼び出しは、次のように返されます。
{
"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
クラスが実装してResponseBodyAdvice
2つのメソッドを。
filter(MethodParameter methodParameter)
決意でプライベートメソッドかどうかを、統一プロセスを傍受するために戻ります。
以下のような:
- カスタム注釈を追加
@IgnorReponseAdvice
無視傍受を。 - いくつかのクラスを分析することはインターセプトしません。
- いくつかのパッケージが傍受していないすべてのクラスを分析します。パッケージに傍受を無視するためのインタフェース。
swagger
springfox.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
取り扱いの方法。
- 決定
Object o
するかどうかnull
のために、null
構造Result
の目標リターンのために。 - 決定
Object o
するかどうかをResult
リターンがこの場合に、インターフェースが作成されてもよい、サブクラス自体又はResult
、再度パッケージを回避するために、判定されたResult
サブクラス自体又はリターンObject o
自体。 - 決定する
Object o
ようにそれがあるかどうかをString
検査する過程で見つかったString
ことがある場合に、判定動作を行った特別な場合、String
実行するためJSON.toJSON(Result.ofSuccess(o)).toString()
の操作のシリアル番号。 - その他のデフォルトのリターン・
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 {
}
春のコンテナに参加
最後に、GlobalDefaultExceptionHandler
内bean
的注入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);
}
}
でしょうGlobalDefaultConfiguration
にresources/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 {
}
使用するインポートが可能。@Import
GlobalDefaultConfiguration
使用
依存追加
<dependency>
<groupId>io.deepblueai</groupId>
<artifactId>unified-dispose-deepblueai-starter</artifactId>
<version>0.1.0.RELEASE</version>
</dependency>
開始オープンクラスの@EnableGlobalDispose
ノートは、することができます。
- 業務用
インタフェース:
@GetMapping("test")
public String test(){
return "test";
}
リターン
{
"succ": true, // 是否成功
"ts": 1566386951005, // 时间戳
"data": "test", // 数据
"code": null, // 错误类型
"msg": null, // 错误描述
"fail": false
}
- @IgnorReponseAdvice:パッケージの注意事項を無視
@IgnorReponseAdvice
許容範囲は次のとおりです。+クラスメソッドは、言ったクラスの識別子は、クラスメソッドが返されたパッケージは無視され返しています。
インタフェース:
@IgnorReponseAdvice // 忽略数据包装 可添加到类、方法上
@GetMapping("test")
public String test(){
return "test";
}
リターン test
概要
重複したコードの多くでのプロジェクトは、開発の量を減らすの特定の目的を達成するためにいくつかの簡単な方法を通過することができます。
サンプルコード住所:統一-廃棄-springboot
GitHubの上:
Purgeyaoは注意を歓迎します