Schauen wir uns zunächst die Projektverzeichnisstruktur dieses Beispiel-Tutorials an:
(natürlich i18n im Ressource Der Ordner und die drei Eigenschaftendateien müssen ebenfalls von uns selbst erstellt werden, aber wir müssen uns nicht um das Ressourcenpaket kümmern. Dies wird automatisch durch Hinzufügen der entsprechenden Konfigurationselemente in der YML generiert (Lesen Sie das Tutorial weiter.)
#🎜 🎜#CodeEnum.java
<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>Einfache Kapselung der zurückgegebenen Daten
ResultData.java # 🎜 🎜##🎜🎜 #Locale, einfache Methodenkapselung von. MessageSource/** * @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; } }
LocaleMessage.javai18n Sprachkonvertierungstool class# 🎜🎜#I18nUtils.javaimport 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); } }
LanguageAspect.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); } }Der nächste Schritt ist ein wichtiger Schritt in unserer Konvertierung. Die AOP-Methode fängt die von der Controller-Schnittstelle zurückgegebenen Daten ab: #🎜 🎜#
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; } }Einfache Interpretation des Codes:
1. Die Adresse des annotationLangCut-Abschnitts Die Steuerung muss von Ihnen selbst in den Ordnerpfad geändert werden, den Sie steuern möchten 🎜#
Nur wenn es wahr ist, wird dieses AOP-Abfangen wirksam
3. Das können Sie diesem Satz entnehmen Was ich in diesem Artikel übernommen habe, ist, die Docking-Schnittstellenpartei (Frontend) die erforderlichen Informationen im Header-Sprachflag übergeben zu lassen. Die Übergabe von EN (Englisch) bedeutet beispielsweise, dass die Aufforderungssprache in Englisch umgewandelt werden muss.
Sie können die tatsächliche Situation Ihres Projekts kombinieren und so ändern, dass es aus YML liest, aus der Datenbank liest oder aus Redis liest usw.
String msg = r.getMessage().trim();
Der Zweck dieser beiden Zeilen von Der Code besteht darin, die Nachrichtenaufforderung im abgefangenen Objekt abzurufen. Wenn die Rückgabedaten Ihres Projekts nicht die in meinem Artikel verwendeten ResultData sind, müssen Sie selbst magische Anpassungen vornehmen.mess_zh_CN.properties
Schließlich gibt es drei Mess-Eigenschaftendateien:mess.properties
Angepasste Rückgabesprache = Sie OK, Wenn der Artikel für Sie nützlich ist, folgen Sie bitte + Favorit + Kommentar
Diese Datei folgt der AOP-Abfangmethode in diesem Artikel. Wenn dies nicht möglich ist, wird sie zuerst erkannt erkannt wird, wird es in der Datei
mess.properties gefunden.mess_en_US.properties
Anfrage fehlgeschlagen=fehlgeschlagen
Anfrage erfolgreich=erfolgreich
Anfrageerfolgreich=Anfrageerfolgfail=AnfragefehlerAnfragefehler=Anfragefehler
Erfolg=Anfrageerfolg
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; } } }
Rufen Sie den Test auf:# 🎜🎜 #
Das obige ist der detaillierte Inhalt vonWie Springboot+AOP die Internationalisierung von Eingabeaufforderungen für Rückgabedaten implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!