gpt4 book ai didi

java - Spring Boot 本地化来自 RestController 的每个响应参数

转载 作者:行者123 更新时间:2023-11-30 06:40:08 25 4
gpt4 key购买 nike

我正在尝试本地化项目中每个 API 响应中的几乎每个参数。

我发现我们可以在 Spring Boot 中做这样的事情:

MessageSourceAccessor accessor = new MessageSourceAccessor(messageSource, locale);
return accessor.getMessage(code);

并将代码与本地化消息映射保存在 messages_en.propertiesmessages_fr.properties 等中。

但对于我的应用程序,我特别有两个要求:

  • 我想将此逻辑与我的业务逻辑分开,即我不想在每个 Controller 中编写本地化逻辑。
  • 我想在通过服务器的所有响应的每个响应参数上尝试它,也许是在 Jackson 将对象转换为字符串时或转换为 JSON 之后。

Spring Boot 有没有办法实现这一点,或者有没有可用的库?

最佳答案

我已经找到了解决这个问题的方法。我没有使用 String 作为字段,而是使用像 LocalizedText 这样的自定义类:

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class LocalizedText {

private String text;

}

对于序列化,我创建了一个反序列化器LocalizedTextSerailizer,如下所示:

import java.io.IOException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

@Component
public class LocalizedTextSerializer extends StdSerializer<LocalizedText> {

private static final long serialVersionUID = 619043384446863988L;

@Autowired
I18nUtil messages;

public LocalizedTextSerializer() {
super(LocalizedText.class);
}

public LocalizedTextSerializer(Class<LocalizedText> t) {
super(t);
}

@Override
public void serialize(LocalizedText value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeString(messages.get(value.getText()));
}

}

I18nUtil:

import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
public class I18nUtil {

@Autowired
private MessageSource messageSource;

public String get(String code) {
try {
MessageSourceAccessor accessor = new MessageSourceAccessor(messageSource, Locale.getDefault());
return accessor.getMessage(code);
} catch (NoSuchMessageException nsme) {
log.info("Message not found in localization: " + code);
return code;
}
}
}

这几乎达到了目的,我不必搞乱业务逻辑,并且我可以本地化应用程序中任何响应的任何参数。

注意:

  1. 此处,如果 I18nUtil 在 message.properties 中找不到任何消息,则返回相同的代码。
  2. I18nUtil 中使用默认语言环境,用于演示。

关于java - Spring Boot 本地化来自 RestController 的每个响应参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44497282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com