シーン
私たちのチームは現在、マルチターミナルデータインターフェイスドッキングの問題に直面しています。この問題を解決するために、インターフェイスドッキングの仕様を定義しました。
フロントエンド(Android、iOS、Webフロントエンド)とバックエンドで、データ形式の仕様について説明し、JSONのデータ形式を決定しました。
{"code": "200"、 "data":{"": ""}、 "message": "処理された"} {"code": "300"、 "data":{"": ""}、 "message": "no this user"}}コードはリクエスト処理ステータスを表します。200は通常の処理、300はビジネス例外処理、500はシステム例外処理です。
データは、背景によって返されるデータを表します。
メッセージのバックグラウンドプロンプトは、正常または成功したときにエラー理由を返します。
問題はこちらです
誰もが各JSONビューの返品値を包むことができるのは非常に面倒ではないでしょうか?
この時点で、AOPが起動されます。 AOPのアイデアを使用して、クライアントに応答する前にリクエストがJSONに戻ったときにレイヤーにラップすることができます。
実装手順
AOPを有効にします
<! - baseパッケージ複数の場合、 "、" - > <context:component-scanベースパッケージ= "com.we、cn.isuyang"> <context:inclute-filter type = "annotation" expression = "org.stringframework.stereotype.service" /> <context:explude-filter at = "annotation" Annotation "Annotation" expression = "org.springframework.stereotype.controller" /> < /context:component-scan> <! - open aop annotation-> <aop:aspectj-autoproxy />
セクションを作成します
/*** JSONは接線を返します。JSONの処理に使用される接線* <p>*結果は結果を返します** @author zhuangjunxiang([email protected])* @date 2017年4月28日* /@component@aspeant@order(2)public class jsonreturnspect { /**デフォルトのシステムの構成ファイル** @param PJP Tangent Point*/ @Around(value = "@Annotation(org.springframework.web.bind.annotation.ansponsebody)")@order(1)パブリックオブジェクトワープ(最終手続きJoinpoint PJP)スロースロー可能if(isreturnvoid(pjp)){httpservletresponse response =((servletRequestattributes)requestContextholder.getRequestattributes()).getResponse(); if(isneedwrap(pjp)){respons.getWriter()。write(jsonutil.tojson(success( "Operation suceds"))); }返品リスト。 } return data(list); } / ** *は必要なパッケージ * * * @param pjp tangent point * * @return trueは必要ないことを意味します * / private boolean isneedwrap(final proceedingjoinpoint pjp){method method = aspectil.getmethod(pjp); return!method.isannotationPresent(void.class); } / ** *空に戻すかどうか * * @param pjp * @return true:リターンタイプは無効です、false:return typeはvoid * / private boolean isreturnvoid(proceedingjoinpoint pjp){method method = aspectil.getmethod(pjp); class <?> returnType = method.getReturnType(); return "void" .equals(returnType.getName()); } / ***コンストラクションが成功した後にオブジェクトを返す* <p>*メッセージが空の場合、プロンプトがプロンプトされていない場合、それが空になっていない場合、それはプロンプトされていません** @Paramメッセージ成功メッセージ* @return jsonオブジェクト* / public static Map <string、object> success(最終文字列>成功) map.put( "code"、statuscode.success.key()); map.put( "message"、message); map.put( "data"、 "); return map;} / ***構成の成功後にオブジェクトを返します* <p>*メッセージが空である場合、プロンプトがなく、空のプロンプトがなく** @return jsonオブジェクト* / public static map <string、object> data(final object data){map <string> object> object> map = maputil.mey(); map.put( "message);
分析します
@Componentこの注釈とは、インスタンス化のためにこのオブジェクトをスプリングコンテナに引き渡すことを意味します。
@Aspectは、これがファセットクラスであることを意味します
@Around(value = "@annotation(org.springframework.web.bind.annotation.ResponseBody)")
つまり、@ResponseBodyアノテーションを使用したすべての方法がこのセクションの中間点であることを意味します。つまり、傍受されることになります。
知らせ:
WarpメソッドのProachingJoinPointパラメーターは、ournovering joinpoint subclass procemingjoinpointのみを使用できます。これは、周囲の通知によってのみ使用できます。
各接続ポイントタイプは、プロキシメソッドを呼び出して、戻り値を取得して変更できます。それ以外の場合は、JoinPointを使用することです。
ケース1:コントローラークラスの関数には返品値が必要ないと仮定します
たとえば、エンティティオブジェクトを更新するとき、更新結果を返すだけで問題ありません。データを入力する必要はありません。
返されたデータ形式:
{"code": "200"、 "data": ""、 "message": "処理されました"}実装のアイデア:
アスペクト処理クラスの処理関数でこの関数の返品値タイプを取得します。それが無効である場合、指定された形式でデータを返します。
上記のisreturnvoid()は、このような判断です。
関数の返品値をvoidに変更する必要があります。
@requestmapping@responsebodypublic void add(long matchid、model model){slxsignupviewservice.setaddinfo(matchid、model);}ケース2:コントローラークラスの関数の返品値をラップする必要がないと仮定します
例えば:
いくつかのフロントエンドプラグインとサードパーティのドッキング(支払い)の返品値が指定されています。
ファイルをダウンロードすると、冗長です。
実装のアイデア:
@voidの注釈をカスタマイズします:
/***空の注釈* <p>*コントローラーレイヤーのリターン値を識別するために使用される** @author wangsen([email protected])* @date 2017年8月17日*/@ターゲット({elementtype.method})
この注釈をコントローラーレイヤーメソッドに追加します
/***支払い完了
この関数に、このセクション処理クラスにこの注釈が含まれているかどうかを判断します。
その後、処理されず、そのまま返されません。
jsonreturnaspectクラスのisneedwrap()メソッドは、この要件を処理します。
要約します
上記は、JSONビュー実装の実装アイデアの分析で、紹介されたカスタムスプリングMVCのアイデアです。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!