繁体   English   中英

Spring 引导内部化无法按请求工作

[英]Spring boot internalization does not work per request

我知道这个问题可能有答案,但我是 spring 引导的新手。 我需要对我的 rest 端点进行内部化,我按照这个博客来实现内部化,但问题是一个。 语言不会因请求而改变,它仅在应用程序启动后才会改变. 这是我正在使用的代码。 我在资源目录下创建了 4 个不同的 messages.properties,即 messages_fr.properties、messages_pt.properties、messages_sw.properties

@Configuration
public class MyCustomLocaleResolver extends AcceptHeaderLocaleResolver
        implements WebMvcConfigurer {
    List<Locale> LOCALES = Arrays.asList(
            new Locale("en"),
            new Locale("pt"),
            new Locale("sw"),
            new Locale("fr"));

    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        String headerLang = request.getHeader("Accept-Language");
        System.out.println("header:"+headerLang);
        return headerLang == null || headerLang.isEmpty()
                ? Locale.getDefault()
                : Locale.lookup(Locale.LanguageRange.parse(headerLang), LOCALES);
    }

    @Bean
    public MessageSource messageSource() {
        final ResourceBundleMessageSource rs = new ResourceBundleMessageSource();
        rs.setDefaultEncoding(StandardCharsets.ISO_8859_1.name());
        rs.setBasename("messages");

        rs.setUseCodeAsDefaultMessage(true);
        return rs;
    }

}

和翻译器class

@Component
public class LanguageTranslator {

    private static ResourceBundleMessageSource messageSource;

    @Autowired
    LanguageTranslator(ResourceBundleMessageSource messageSource) {
        LanguageTranslator.messageSource = messageSource;
    }

    public static String translate(String msg) {
        Locale locale = LocaleContextHolder.getLocale();
        return messageSource.getMessage(msg, null, locale);
    }
}

这是我的 postman 请求在此处输入图像描述 这是messages_fr.properties

在此处输入图像描述 和项目结构在此处输入图像描述

这是我的 controller 代码

@RestController
@RequestMapping("/home")
public class HomeContoller {

    @Autowired
    private SystemSettingService settingService;



    @GetMapping("/")
    public String home() {

        return "Home page";
    }

    @RequestMapping(value = "/demo", method = RequestMethod.POST)
    public ResponseEntity all_menu_assignment(HttpServletRequest req)  {
   

        return  ResponseEntity
                .ok().body(new ServerResponse(Common.SUCCESS_CODE,Common.SUCCESS_MESSAGE));

    }
}

这是我的常见 class

public class Common{
  public static String SUCCESS_MESSAGE= LanguageTranslator.translate("SUCCESS_MESSAGE");
}

LocaleContextHolder保存当前线程的语言环境——因此在 static 变量中引用它将导致使用默认的本地 VM(因为该常量将在启动期间初始化)。

像这样的东西应该工作:

@RestController
@RequestMapping("/home")
public class HomeContoller {

    @Autowired
    private SystemSettingService settingService;

    @GetMapping("/")
    public String home() {

        return "Home page";
    }

    @RequestMapping(value = "/demo", method = RequestMethod.POST)
    public ResponseEntity all_menu_assignment(HttpServletRequest req)  {
   

        return  ResponseEntity
                .ok().body(new ServerResponse(Common.SUCCESS_CODE, LanguageTranslator.translate("SUCCESS_MESSAGE")));

    }
}

此外,最好将LanguageTranslator中的translate方法设为非静态,并在 controller 中注入(自动装配)object。

Translator.toLocale(Common.SUCCESS_MESSAGE) 在您的 controller api 方法中丢失

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM