ホームページ >Java >&#&チュートリアル >Springboot+AOP が戻りデータ プロンプトの国際化を実装する方法
最初に、このサンプル教育のプロジェクト ディレクトリ構造を確認します。
(もちろん、i18n フォルダーと 3 つのプロパティ ファイルは、リソースも自分で構築する必要がありますが、リソース バンドルについて心配する必要はありません。これは、対応する構成項目を yml に追加することで自動的に生成されます。よくわからない場合は、チュートリアルを読み続けてください)
入力開始 (CV) コード:
pom.xml 依存関係:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.68</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
リターン コード列挙
CodeEnum.java
/** * @author JCccc */ public enum CodeEnum { SUCCESS(1000, "请求成功"), FAIL(2000, "请求失败"); public final int code; public final String msg; public Integer getCode() { return this.code; } CodeEnum(int code, String msg) { this.code = code; this.msg = msg; } public String getMsg() { return this.msg; } }
戻りデータの単純なカプセル化
ResultData.java
import com.test.myi18n.enums.CodeEnum; import lombok.Data; /** * @author JCccc */ @Data public class ResultData<T> { private Integer code; private String message; private T data; public ResultData(int code, String message) { this.code = code; this.message = message; } public static ResultData success(CodeEnum codeEnum) { return new ResultData(codeEnum.code, codeEnum.msg); } public static ResultData success(String msg) { return new ResultData(CodeEnum.SUCCESS.getCode(),msg); } }
ロケール、MessageSource の単純なメソッドのカプセル化
LocaleMessage.java
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Component; import java.util.Locale; /** * @author JCccc */ @Component public class LocaleMessage { @Autowired private MessageSource messageSource; public String getMessage(String code){ return this.getMessage(code,new Object[]{}); } public String getMessage(String code,String defaultMessage){ return this.getMessage(code,null,defaultMessage); } public String getMessage(String code,String defaultMessage,Locale locale){ return this.getMessage(code,null,defaultMessage,locale); } public String getMessage(String code,Locale locale){ return this.getMessage(code,null,"",locale); } public String getMessage(String code,Object[] args){ return this.getMessage(code,args,""); } public String getMessage(String code,Object[] args,Locale locale){ return this.getMessage(code,args,"",locale); } public String getMessage(String code,Object[] args,String defaultMessage){ return this.getMessage(code,args, defaultMessage,LocaleContextHolder.getLocale()); } public String getMessage(String code,Object[]args,String defaultMessage,Locale locale){ return messageSource.getMessage(code,args, defaultMessage,locale); } }
i18n 言語変換ツール クラス
I18nUtils.java
import java.util.Locale; import com.test.myi18n.message.LocaleMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class I18nUtils { @Autowired private LocaleMessage localeMessage; /** * 获取key * * @param key * @return */ public String getKey(String key) { String name = localeMessage.getMessage(key); return name; } /** * 获取指定哪个配置文件下的key * * @param key * @param local * @return */ public String getKey(String key, Locale local) { String name = localeMessage.getMessage(key, local); return name; } }
次のステップは、変換における重要なステップです。メソッドは、コントローラー インターフェイスから返されたデータをインターセプトします。
LanguageAspect.java
import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import javax.servlet.http.HttpServletRequest; import java.util.*; /** * @author JCccc */ @Aspect @Component @AllArgsConstructor @ConditionalOnProperty(prefix = "lang", name = "open", havingValue = "true") public class LanguageAspect { @Autowired I18nUtils i18nUtils; @Pointcut("execution(* com.test.myi18n.controller.*.*(..)))") public void annotationLangCut() { } /** * 拦截controller层返回的结果,修改msg字段 * * @param point * @param obj */ @AfterReturning(pointcut = "annotationLangCut()", returning = "obj") public void around(JoinPoint point, Object obj) { Object resultObject = obj; try { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); //从获取RequestAttributes中获取HttpServletRequest的信息 HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST); String langFlag = request.getHeader("lang"); if (null != langFlag) { ResultData r = (ResultData) obj; String msg = r.getMessage().trim(); if (StringUtils.isNotEmpty(msg)) { if ("CN".equals(langFlag)) { Locale locale = Locale.CHINA; msg = i18nUtils.getKey(msg, locale); } else if ("EN".equals(langFlag)) { Locale locale = Locale.US; msg = i18nUtils.getKey(msg, locale); } else { msg = i18nUtils.getKey(msg); } } r.setMessage(msg); } } catch (Exception e) { e.printStackTrace(); //返回原值 obj = resultObject; } } }
コードの単純な解釈:
1. annotationLangCut カットオフ制御は制御したいフォルダに自分で変更する必要がある Path2. @ConditionalOnProperty アノテーション、yml の lang で始まる設定項目を読み込み、キーはオープン、値は true
これが true の場合にのみ、この AOP インターセプトは有効になります
3. String langFlag = request.getHeader("lang");
この文から、私が何をしているのかがわかります。この記事で採用されているのは、ヘッダーで使用する必要がある言語フラグをドッキング インターフェイス パーティ (フロントエンド) に渡すことです。たとえば、EN (英語) を渡すと、プロンプト言語を英語に変換する必要があることを意味します。
プロジェクトの実際の状況を組み合わせて、yml から読み取る、データベースから読み取る、redis から読み取るなどに変更できます。4. ResultData r = (ResultData) obj;
String msg = r.getMessage().trim();
これら 2 行のコードの目的は、 intercepted obj into メッセージ プロンプトを取得する プロジェクトの戻りデータが私の記事で使用されている ResultData ではない場合は、自分で魔法の調整を行う必要があります。
最後に、3 つの混乱プロパティ ファイルがあります:
mess.properties
カスタマイズされた戻り言語 = こんにちは、この記事がお役に立ちましたら、お気に入りのコメントにご注意ください
このファイルは、この記事の aop インターセプト方法に従って、最初に現在の言語フラグの値を検出します。検出されない場合は、## で見つかります。 #mess.properties ファイル。
リクエスト成功=成功mess_zh_CN.propertiesリクエスト失敗=失敗
リクエストの成功 = リクエストの成功最後に、全員に効果を実証するテスト インターフェイスを作成します。リクエストの失敗 = リクエストの失敗
success = リクエストの成功
fail = リクエストの失敗
@GetMapping("test") public ResultData test(@RequestParam int testNum) { if (1==testNum){ return ResultData.success(CodeEnum.SUCCESS); } if (2==testNum){ return ResultData.success(CodeEnum.FAIL); } if (3==testNum){ return ResultData.success("自定义的返回语"); } return ResultData.success(CodeEnum.SUCCESS); }コールテスト:
以上がSpringboot+AOP が戻りデータ プロンプトの国際化を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。