Springboot+AOP 데이터 제시 어 국제 화 를 되 돌려 주 는 예제 코드

머리말
이 글 의 내용:
제시 어의 국제 화 반환,다 중 언어 사용자 정의.
본 고 는 op 방식 을 사용 하여 인터페이스 가 돌아 오 는 데 이 터 를 차단 하고 전환 합 니 다.
본문  
먼저 이번 예시 교학 의 프로젝트 목록 구 조 를 살 펴 보 자.

 (물론 resource 에 있 는 i18n 폴 더 와 세 개의 properties 파일 도 우리 가 직접 만들어 야 합 니 다.그러나 그 resource Bundle 은 상관 하지 않 습 니 다.이것 은 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 언어 변환 도구 클래스
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;
    }
}
다음은 우리 가 전환 하 는 관건 적 인 부분 입 니 다.op 방식 으로 contrller 인터페이스 가 돌아 오 는 데 이 터 를 차단 합 니 다.
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.  annotation LangCut 위 에 있 는 절 점 제어 주 소 는 스스로 고 쳐 야 합 니 다.제어 하고 싶 은 폴 더 경로 로 바 꿔 야 합 니 다.
 2.  @Condition alOnProperty 주 해 는 yml 에서 lang 시작 설정 항목 을 읽 습 니 다.key 는 open 이 고 value 는 true 입 니 다.
true 를 위해 서 만 이 op 차단 이 적 용 됩 니 다.
3.  String langFlag = request.getHeader("lang");
이 구절 에서 볼 수 있 듯 이 이번 글 은 인터페이스 측(전단)이 header 에 사용 할 언어 flag 를 입력 하도록 하 는 것 입 니 다.예 를 들 어 EN(영어)에 들 어가 면 제시 어 를 영어 로 바 꿔 야 한 다 는 뜻 이다.
여러분 은 자신의 프로젝트 의 실제 상황 과 결합 하여 yml 에서 읽 거나 데이터베이스 에서 읽 거나 redis 에서 읽 는 등 으로 바 꿀 수 있 습 니 다.
4.  ResultData r = (ResultData) obj;
     String msg = r.getMessage().trim();
이 두 줄 의 코드 는 차단 한 obj 의 message 알림 어 를 가 져 오기 위해 서 입 니 다.만약 에 프로젝트 의 반환 데이터 가 제 글 에서 사용 하 는 ResultData 가 아니라면 스스로 변경 해 야 합 니 다.
마지막 으로 mess properties 파일 세 개:
mess.properties 
사용자 정의 반송 어=안녕하세요,글 이 유용 하 다 면 관심+모음 집+댓 글
이 파일 은 본문 에서 op 의 차단 방식 에 따라 현재 언어 flag 값 을 먼저 감지 합 니 다.감지 되 지 않 으 면 h 가 됩 니 다.
mess.properties 파일 에서 찾 습 니 다.
mess_en_US.properties
요청 성공=success
요청 실패=fail
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 가 데이터 제시 어 내용 을 되 돌려 주 는 것 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 을 바 랍 니 다!

좋은 웹페이지 즐겨찾기