🐎 @I18nField 新增 condition 属性,用于控制是否进行国际化处理,减少无效解析,提升性能

This commit is contained in:
b2baccline
2021-08-22 21:11:54 +08:00
parent 07c2c67815
commit 11930b8dc4
9 changed files with 76 additions and 46 deletions

View File

@@ -29,4 +29,10 @@ public @interface I18nField {
@AliasFor("value")
String code() default "";
/**
* 是否进行国际化的条件判断语句SpEL 表达式),默认未 “”,表示永远翻译
* @return 返回 boolean 的 SpEL 表达式
*/
String condition() default "";
}

View File

@@ -4,13 +4,15 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.core.MethodParameter;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
@@ -20,7 +22,9 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
* 利用 ResponseBodyAdvice 对返回结果进行国际化处理
@@ -38,6 +42,16 @@ public class I18nResponseAdvice implements ResponseBodyAdvice<Object> {
private Locale fallbackLocale = null;
/**
* SpEL 解析器
*/
private static final ExpressionParser PARSER = new SpelExpressionParser();
/**
* 表达式缓存
*/
private static final Map<String, Expression> EXPRESSION_CACHE = new HashMap();
public I18nResponseAdvice(MessageSource messageSource, I18nOptions i18nOptions) {
this.messageSource = messageSource;
@@ -99,6 +113,21 @@ public class I18nResponseAdvice implements ResponseBodyAdvice<Object> {
if (i18nField == null) {
continue;
}
// 国际化条件判断
String conditionExpression = i18nField.condition();
if (StrUtil.isNotEmpty(conditionExpression)) {
Expression expression = EXPRESSION_CACHE.get(conditionExpression);
if (expression == null) {
expression = PARSER.parseExpression(conditionExpression);
EXPRESSION_CACHE.put(conditionExpression, expression);
}
Boolean needI18n = expression.getValue(source, Boolean.class);
if (needI18n != null && !needI18n) {
continue;
}
}
// 获取国际化的唯一标识
String annotationCode = i18nField.code();
String code = StrUtil.isNotEmpty(annotationCode) ? annotationCode : (String) fieldValue;

View File

@@ -8,7 +8,6 @@ import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;
/**