>Java >java지도 시간 >Springboot+AOP가 반환 데이터 프롬프트의 국제화를 구현하는 방법

Springboot+AOP가 반환 데이터 프롬프트의 국제화를 구현하는 방법

WBOY
WBOY앞으로
2023-05-29 15:45:331364검색

텍스트

먼저 이 샘플 튜토리얼의 프로젝트 디렉터리 구조를 살펴보세요.

Springboot+AOP가 반환 데이터 프롬프트의 국제화를 구현하는 방법

(물론 리소스에 있는 i18n 폴더와 세 가지 속성 파일도 직접 빌드해야 하지만 리소스 번들, 이는 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);
    }
}

Locale, 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 언어 변환 도구 수업

I1 8nUtils.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;
    }
}

다음 단계는 변환의 핵심 단계입니다. aop 메소드는 컨트롤러 인터페이스에서 반환된 데이터를 가로챕니다:

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 주소는 직접 변경해야 합니다. 제어하려는 폴더 경로로 변경하세요

2. @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();

이 두 줄의 코드의 목적은 가로채는 obj에서 메시지 프롬프트를 얻는 것입니다. 반환되는 데이터는 제 글에 사용된 ResultData가 아니므로 직접 조정하셔야 합니다.

마지막은 세 가지 mess 속성 파일입니다.

mess.properties

맞춤형 반환 언어 = 안녕하세요, 기사가 도움이 되었다면 팔로우 + 즐겨찾기 + 댓글을 남겨주세요

이 파일은 이 기사의 aop를 따릅니다. 차단 방법에서는 현재 언어 플래그 값이 먼저 감지됩니다. 감지되지 않으면
mess.properties 파일에서 찾을 수 있습니다.

mess_en_US.properties

요청 성공=성공
요청 실패=실패

mess_zh_CN.properties

요청 성공=요청 성공
요청 실패=요청 실패
성공=요청 성공
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가 반환 데이터 프롬프트의 국제화를 구현하는 방법

Springboot+AOP가 반환 데이터 프롬프트의 국제화를 구현하는 방법

Springboot+AOP가 반환 데이터 프롬프트의 국제화를 구현하는 방법

위 내용은 Springboot+AOP가 반환 데이터 프롬프트의 국제화를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제