Java Spring引导内部化不适用于每个请求

Java Spring引导内部化不适用于每个请求,java,spring-boot,Java,Spring Boot,我知道这个问题可能有答案,但我对spring boot是个新手。我需要对我的rest端点进行内部化,我跟随blog来实现内部化,但问题是其中之一。语言不会根据请求更改,它只会在应用程序启动后更改(假设在我的帖子中启动时),语言是fr,但在我将fr更改为pt(葡萄牙语)后,它不会选择pt,它仍然保留在fr中。这是我正在使用的代码。我在resources目录下创建了4个不同的messages.properties,即messages\u fr.properties、messages\u pt.pro

我知道这个问题可能有答案,但我对spring boot是个新手。我需要对我的rest端点进行内部化,我跟随blog来实现内部化,但问题是其中之一。语言不会根据请求更改,它只会在应用程序启动后更改(假设在我的帖子中启动时),语言是fr,但在我将fr更改为pt(葡萄牙语)后,它不会选择pt,它仍然保留在fr中。这是我正在使用的代码。我在resources目录下创建了4个不同的messages.properties,即messages\u fr.properties、messages\u pt.properties和messages\u 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;
    }

}
这是我的邮递员请求 这里是消息\u fr.properties

和项目结构

这是我的控制器代码

@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));

    }
}
这是我的普通课

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

LocaleContextHolder
保存当前线程的区域设置-因此在静态变量中引用它将导致使用默认的VM local(因为常量将在启动期间初始化)

像这样的方法应该会奏效:

@RestController
@请求映射(“/home”)
公共级家庭控制器{
@自动连线
私人系统设置服务设置服务;
@GetMapping(“/”)
公共字符串home(){
返回“主页”;
}
@RequestMapping(value=“/demo”,method=RequestMethod.POST)
公共响应全部菜单分配(HttpServletRequest请求){
返回响应性
.ok().body(新服务器响应(Common.SUCCESS\u代码,LanguageTranslator.translate(“SUCCESS\u消息”));
}
}

另外,最好使
LanguageTranslator
中的
translate
方法非静态,并在控制器中注入(自动连线)对象。

Translator.toLocale(Common.SUCCESS_消息)在控制器api方法中丢失

请共享来自Postman的curl请求。也,确保设置了标头接受语言properly@karthik检查更新的问题你能列出控制器代码吗?@karthik检查更新的代码controller@karthik我的普通类正在调用该函数来翻译检查更新类你看我的普通类已经有了该函数更改了答案以匹配你更改的问题。谢谢我的错误是我使用static访问字段我的公共类正在调用该函数进行翻译
public class Common{
  public static String SUCCESS_MESSAGE= LanguageTranslator.translate("SUCCESS_MESSAGE");
}