Springboot+AOP 데이터 제시 어 국제 화 를 되 돌려 주 는 예제 코드
11181 단어 Springboot데이터제시 어국제 화
이 글 의 내용:
제시 어의 국제 화 반환,다 중 언어 사용자 정의.
본 고 는 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 가 데이터 제시 어 내용 을 되 돌려 주 는 것 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 을 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.