IDEA 优先配置
目录结构
举例 message_ja_JP.properties
device_already_bind=同じ VIN 番号が既に存在します。これは %s と同じ車両ですか?
全局配置
import cn.hutool.core.util.StrUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
@Configuration
public class LocaleResolverConfig implements LocaleResolver {
private static final String HEADER = "X-Locale";
private static final String HEADER_SPLIT_1 = "_";
private static final String HEADER_SPLIT_2 = "-";
private static final Map<String, String> LOCALE_MAP = new LinkedHashMap<>();
static {
LOCALE_MAP.put(LocaleConstants.JA, LocaleConstants.JA_JP);
LOCALE_MAP.put(LocaleConstants.EN, LocaleConstants.EN_US);
}
@Override
public Locale resolveLocale(HttpServletRequest request) {
String lang = request.getHeader(HEADER);
if (StrUtil.isEmpty(lang)) {
lang = request.getHeader(HEADER.toLowerCase());
}
Locale locale = request.getLocale();
if (!StrUtil.isEmpty(lang)) {
if(LOCALE_MAP.containsKey(lang)){
// 请求头传的不规范,此处做个映射
lang = LOCALE_MAP.get(lang);
}
String[] split = lang.split(HEADER_SPLIT_1);
if (split.length != 2) {
split = lang.split(HEADER_SPLIT_2);
}
if (split.length == 2) {
locale = new Locale(split[0], split[1]);
}
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
// do nothing
}
@Bean
public LocaleResolver localeResolver() {
return new LocaleResolverConfig();
}
}
public class LocaleConstants {
public static final String JA = "ja";
public static final String JA_JP = "ja_JP";
public static final String EN = "en";
public static final String EN_US = "en_US";
}
自定义异常类
import lombok.Getter;
import lombok.Setter;
/**
* @author T.J
*/
@Getter
@Setter
public class ApiException extends RuntimeException {
private final int code;
private final String message;
public ApiException(BaseStatus status) {
super(status.getMessage());
this.code = status.getCode();
this.message = status.getMessage();
}
public ApiException(int code, String message) {
super(message);
this.code = code;
this.message = message;
}
/**
* @param status 参数:code, messageKey
*/
public ApiException(IStatus status) {
super(status.getMessage());
this.code = status.getCode();
this.message = MessageUtils.getMessage(status.getMessage());
}
/**
* 支持错误描述 拼接可变参数
*
* @param status status
* @param args 可变参数
*/
public ApiException(IStatus status, String ...args) {
super(status.getMessage());
this.code = status.getCode();
this.message = MessageUtils.getMessage(status.getMessage(), args);
}
}
处理类
import cn.hutool.extra.spring.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import java.util.Locale;
/**
* @author T.J
*/
@Slf4j
public class MessageUtils {
private MessageUtils() {
}
public static String getMessage(String messageKey, String... args) {
try {
Locale locale = LocaleContextHolder.getLocale();
String message = SpringUtil.getBean(MessageSource.class).getMessage(messageKey, args, locale);
if(args.length > NumberConstants.ZERO){
// 配置可变参数
return String.format(message, args);
}else{
return SpringUtil.getBean(MessageSource.class).getMessage(messageKey, args, locale);
}
} catch (Exception e) {
log.debug("get i81n error key: {}", messageKey);
}
return null;
}
}
业务代码
AppAccountBindDevice exist = appAccountBindDeviceService.selectByUserUidAndDeviceCode(param);
if (ObjectUtil.isNotNull(exist)) {
throw new ApiException(ErrorCodeMessage.DEVICE_ALREADY_BIND, param.getDeviceCode());
}