Rumah  >  Artikel  >  Java  >  Cara Springboot+AOP melaksanakan pengantarabangsaan gesaan data pemulangan

Cara Springboot+AOP melaksanakan pengantarabangsaan gesaan data pemulangan

WBOY
WBOYke hadapan
2023-05-29 15:45:331276semak imbas

Teks

Pertama lihat struktur direktori projek tutorial sampel ini:

Cara Springboot+AOP melaksanakan pengantarabangsaan gesaan data pemulangan

(Sudah tentu, folder i18n dan tiga fail sifat dalam resource juga Kami perlu membinanya sendiri, tetapi jangan risau tentang Resource Bundle Ini dijana secara automatik dengan menambahkan item konfigurasi yang sepadan dalam yml Jika anda tidak pasti, teruskan membaca tutorial)

Mula menaip (CV) kod:

pom.xml bergantung pada:

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

kembali penghitungan kod

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

data pengembalian Pekapsulan ringkas

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

Pengkapsulan kaedah mudah setempat bagi 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); }
}

kelas alat penukaran bahasa 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;
    }
}

Langkah seterusnya ialah bahagian penting penukaran kami, kaedah aop memintas data yang dikembalikan oleh antara muka pengawal:

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

Tafsiran ringkas kod:

1. Alamat potongan anotasiLangCut -kawalan titik mati di atas perlu diubah sendiri, dan ditukar kepada folder yang anda mahu kawal Path

2. @ConditionalOnProperty anotasi, baca item konfigurasi bermula dengan lang dalam yml, kunci dibuka, nilainya adalah benar

Hanya jika ia benar, pemintasan aop ini akan berkuat kuasa

3 String langFlag = request.getHeader("lang");
Daripada ayat ini, anda. dapat melihat bahawa apa yang saya pakai dalam artikel ini adalah untuk membiarkan parti antara muka dok (bahagian hadapan) lulus dalam bendera bahasa yang perlu digunakan dalam pengepala. Sebagai contoh, lulus dalam EN (Bahasa Inggeris) bermakna bahasa segera perlu ditukar kepada bahasa Inggeris.

Anda boleh menukarnya untuk membaca daripada yml, membaca daripada pangkalan data, membaca daripada redis, dll. berdasarkan situasi sebenar projek anda.

4. ResultData r = (ResultData) obj;
String msg = r.getMessage().trim();

Dua baris kod ini adalah untuk meletakkan obj yang dipintas ke dalam Dapatkan gesaan mesej Jika data pemulangan projek anda bukan ResultData yang digunakan dalam artikel saya, anda perlu membuat pelarasan ajaib sendiri.

Akhirnya terdapat tiga fail sifat kucar-kacir:

sifat kucar-kacir

Bahasa pemulangan tersuai = Hello, jika artikel itu berguna kepada anda, Sila ikut + kegemaran + komen

Mengikut kaedah pemintasan aop dalam artikel ini, fail ini akan mula-mula mengesan nilai bendera bahasa semasa Jika ia tidak dikesan, ia akan diletakkan dalam
fail mess.properties.

mess_en_US.properties

Permintaan berjaya=berjaya
Permintaan gagal=gagal

mess_zh_CN.properties

Minta kegagalan = Minta kegagalan
kejayaan = Minta kejayaan
gagal = Minta kegagalan

Akhir sekali, tulis antara muka ujian untuk menunjukkan kesan untuk semua orang:

 @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);
    }

Ujian panggilan:

Cara Springboot+AOP melaksanakan pengantarabangsaan gesaan data pemulangan

Cara Springboot+AOP melaksanakan pengantarabangsaan gesaan data pemulangan

Cara Springboot+AOP melaksanakan pengantarabangsaan gesaan data pemulangan

Atas ialah kandungan terperinci Cara Springboot+AOP melaksanakan pengantarabangsaan gesaan data pemulangan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam