Heim >Java >javaLernprogramm >Wie Springboot+AOP die Internationalisierung von Eingabeaufforderungen für Rückgabedaten implementiert

Wie Springboot+AOP die Internationalisierung von Eingabeaufforderungen für Rückgabedaten implementiert

WBOY
WBOYnach vorne
2023-05-29 15:45:331364Durchsuche

Text

Schauen wir uns zunächst die Projektverzeichnisstruktur dieses Beispiel-Tutorials an:

Wie Springboot+AOP die Internationalisierung von Eingabeaufforderungen für Rückgabedaten implementiert

(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 # 🎜 🎜#
/**
 * @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;
    }
}
#🎜🎜 #Locale, einfache Methodenkapselung von. MessageSource

LocaleMessage.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);
    }
}

i18n Sprachkonvertierungstool class

# 🎜🎜#I18nUtils.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: #🎜 🎜#

LanguageAspect.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;
    }
}

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.

4. ResultData r = (ResultData) obj;

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.



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 erfolgreich=erfolgreich

Anfrage fehlgeschlagen=fehlgeschlagen

mess_zh_CN.properties

Anfrageerfolgreich=Anfrageerfolg

Anfragefehler=Anfragefehler

Erfolg=Anfrageerfolg
fail=Anfragefehler


Schreiben Sie endlich eine Testschnittstelle, um die Wirkung für alle zu demonstrieren:

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen