当前位置: 首页 > 知识库问答 >
问题:

如何在Spring启动中国际化 API 错误?

牛越
2023-03-14

我能够国际化一个控制器web页面请求

@RequestMapping(value="/image")
public String image(@RequestHeader(name=HEADER_CONSTANTS.ACCEPT_LANGUAGE, required=false) String al) {

在参数列表中。然而,我试图把它放在一个< code > ResponseEntityExceptionHandler 中,它不工作。

@ControllerAdvice(basePackages="com.example.apis")
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(ApiException.class)
    protected ResponseEntity<Object> handleApiException(ApiException ex, @RequestHeader(name=HEADER_CONSTANTS.ACCEPT_LANGUAGE, required=false) String al) {

2019-05-13 21:59:59.193 WARN 16052 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : 未能调用@ExceptionHandler方法: 受保护的组织

java.lang.IllegalStateException:无法解析受保护的org.springframework.http中索引1处的方法参数。ResponseEntity com.example.apis.RestExceptionHandler.handleApiException(com.exaample.apis.ApiExction,java.lang.String):“java.lang_String”类型的参数1没有合适的解析器

它在没有@Request estHeader参数的情况下工作。如何在JSON API请求的异常处理程序中获取客户端的Accept-LanguageHTTP标头?

Spring Boot 1.5.20

共有3个答案

堵琨
2023-03-14

我根据Deadpool的回答使用了以下内容。如果语言包不包含给定消息键的翻译,我会得到异常(< code > org . spring framework . context . nosuchmessageexception )。如果< code >,我希望可以默认为英语。属性文件不包含翻译,在一行中。

@ExceptionHandler(ApiException.class)
protected ResponseEntity<Object> handleApiException(ApiException ex, Locale locale) {
    String defaultMessage = messages.getMessage(ex.errorMessage, ex.errorArgument, Locale.ENGLISH);
    String localErrorMessage = messages.getMessage(ex.errorMessage, ex.errorArgument, defaultMessage, locale);
仲皓君
2023-03-14

@ExceptionHandler文档

是无效语法,看方法签名的规则。可以使用WebRequest获取Header

@ExceptionHandler(ApiException.class)
protected ResponseEntity<Object> handleApiException(ApiException ex, WebRequest request) {
     request.getHeader(HttpHeaders.ACCEPT_LANGUAGE);
}

用于处理特定处理程序类和/或处理程序方法中的异常的注释。

用这个注释标注的处理程序方法允许有非常灵活的签名。它们可能具有以下任意顺序的参数类型:

>

  • 异常参数:声明为一般异常或更具体的异常。如果注释本身没有通过其value()缩小异常类型,这也可以用作映射提示。

    请求和/或响应对象(通常来自Servlet API)。您可以选择任何特定的请求/响应类型,例如servlet request/http servlet request。

    Session对象:通常为HttpSession。此类型的参数将强制相应会话的存在。因此,这样的参数永远不会为空。请注意,会话访问可能不是线程安全的,特别是在Servlet环境中:如果允许多个请求同时访问会话,请考虑将“synchronizeOnSession”标志切换为“true”。

    Web请求或本机Web请求。允许通用请求参数访问以及请求/会话属性访问,而无需与本机 Servlet API 相关联。

    当前请求区域设置的区域设置(由可用的最具体的区域设置解析器确定,即Servlet环境中配置的LocaleResolver)。用于访问请求内容的InputStream/Reader。这将是Servlet API公开的原始InputStream/Reader。

    用于生成响应内容的输出流/编写器。这将是Servlet API公开的原始输出流/编写器。

    模型作为从处理程序方法返回模型映射的替代方法。请注意,提供的模型没有预先填充常规模型属性,因此始终为空,以便为特定于异常的视图准备模型

  • 齐威
    2023-03-14

    如果您需要的是当前用户的语言环境,则应注册LocaleResolver,然后从LocaleContextHolder获取语言环境。

    @Bean
    public LocaleResolver localeResolver() {
        // Registering accept-header Locale Resolver with default Locale.US
        AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
        localeResolver.setDefaultLocale(Locale.US);
    
        return localeResolver;
    }
    

    然后,您可以通过调用LocaleContextHolder.getLocale()来获取异常处理程序中的语言环境。

     类似资料:
    • 我正在做一个小项目,当我在Spring尝试实现i18n时,它不起作用,即使我尝试更改默认语言,它也不起作用。这是我的spring servlet。XML代码 我有4条消息。类路径消息中的属性。属性,消息。properties,messages\u fr.properties,messages\u de.properties默认语言不会始终更改其使用messages\u en。属性(如果删除邮件)。

    • Rails 国际化 API Rails 内建支持 Ruby I18n(internationalization 的简写)。Ruby I18n 这个 gem 用法简单,是个扩展性强的框架,可以把程序翻译成英语之外的其他语言,或者为程序提供多种语言支持。 “国际化”是指把程序中的字符串或者其他需要本地化的内容(例如,日期和货币的格式)提取出来的过程。“本地化”是指把提取出来的内容翻译成本地语言或者本地

    • 主要内容:1. 配置 Spring MVC 的配置文件,2. 编写国际化资源文件,3. 在页面中获取国际化内容,4. 手动切换语言环境,示例国际化(Internationalization 简称 I18n,其中“I”和“n”分别为首末字符,18 则为中间的字符数)是指软件开发时应该具备支持多种语言和地区的功能。 换句话说,软件应该能够同时应对多个不同国家和地区用户的访问,并根据用户地区和语言习惯,提供相应的、符合用具阅读习惯的页面和数据。例如,为中国用户提供汉语界面显示,为美国用户提供提供英语界

    • 主要内容:1. 编写国际化资源文件,2. 使用 ResourceBundleMessageSource 管理国际化资源文件,3. 获取国际化内容,验证,手动切换语言国际化(Internationalization 简称 I18n,其中“I”和“n”分别为首末字符,18 则为中间的字符数)是指软件开发时应该具备支持多种语言和地区的功能。换句话说就是,开发的软件需要能同时应对不同国家和地区的用户访问,并根据用户地区和语言习惯,提供相应的、符合用具阅读习惯的页面和数据,例如,为中国用户提供汉语界面显示

    • 问题内容: 我想知道如何在JavaScript中处理国际化。我用谷歌搜索,但没有得到令人信服的答案: JavaScript是否具有对国际化的本地支持? JavaScript中的i18n是什么? 如何处理日历,货币,日期等? 我已经阅读过JavaScript中的Internationalization。 问题答案: 旧版浏览器中的本地化支持很差。最初,这是由于ECMAScript语言规范中的短语如下

    • 概述 为了让Django项目可翻译,你必须添加一些钩子到你的Python 代码和模板中。这些钩子叫做翻译字符串。它们告诉Django:“如果这个文本的翻译可用,应该将它翻译成终端用户的语言。”你需要标记这些可翻译的字符串;系统只会翻译它知道的字符串。 Django 提供一些工具用于提取翻译字符串到消息文件中。这个文件方便翻译人员提供翻译字符串的目标语言。翻译人员填充完消息文件后,必须编译它。这个过