Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将Spring Boot中的API错误国际化?_Java_Spring_Spring Boot_Internationalization_Spring Rest - Fatal编程技术网

Java 如何将Spring Boot中的API错误国际化?

Java 如何将Spring Boot中的API错误国际化?,java,spring,spring-boot,internationalization,spring-rest,Java,Spring,Spring Boot,Internationalization,Spring Rest,我能够用 @RequestMapping(value="/image") public String image(@RequestHeader(name=HEADER_CONSTANTS.ACCEPT_LANGUAGE, required=false) String al) { 在参数列表中。然而,我试图将它放在一个ResponseEntityExceptionHandler中,但它不起作用 @ControllerAdvice(basePackages="com.example.apis")

我能够用

@RequestMapping(value="/image")
public String image(@RequestHeader(name=HEADER_CONSTANTS.ACCEPT_LANGUAGE, required=false) String al) {
在参数列表中。然而,我试图将它放在一个
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) {
@ControllerAdvice(basePackages=“com.example.api”)
公共类RestExceptionHandler扩展了ResponseEntityExceptionHandler{
@ExceptionHandler(ApiException.class)
受保护的ResponseEntity HandLeapeException(ApiException ex,@RequestHeader(name=HEADER\u CONSTANTS.ACCEPT\u LANGUAGE,required=false)字符串al){
2019-05-13 21:59:59.193警告16052---[nio-8080-exec-1].m.a.ExceptionHandlerExceptionResolver:调用@ExceptionHandler方法失败:受保护的org.springframework.http.ResponseEntity com.example.api.RestExceptionHandler.HandLeapeException(com.example.api.ApiException,java.lang.String)

java.lang.IllegalStateException:无法解析受保护的org.springframework.http.ResponseEntity com.example.api.RestExceptionHandler.handleAppieException(com.example.api.apieException,java.lang.String)中索引1处的方法参数:对于“java.lang.String”类型的参数1,没有合适的解析程序

它在没有
@RequestHeader
参数的情况下工作。如何在JSON API请求的异常处理程序中获取客户端的
接受语言
HTTP头


Spring Boot 1.5.20

如果您需要的是当前用户的区域设置,那么您应该注册一个
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()

这是无效语法,请查看方法签名的规则。您可以使用
WebRequest
获取
标题

@ExceptionHandler(ApiException.class)
protected ResponseEntity<Object> handleApiException(ApiException ex, WebRequest request) {
     request.getHeader(HttpHeaders.ACCEPT_LANGUAGE);
}
@ExceptionHandler(ApiException.class)
受保护的响应HandLeapeException(ApiException ex,WebRequest请求){
getHeader(HttpHeaders.ACCEPT_语言);
}
用于处理特定处理程序类和/或处理程序方法中异常的注释

使用此注释进行注释的处理程序方法允许具有非常灵活的签名。它们可以具有以下类型的参数,顺序可以任意:

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

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

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

  • WebRequest或NativeWebRequest。允许通用请求参数访问以及请求/会话属性访问,无需与本机Servlet API绑定

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

  • 用于生成响应内容的OutputStream/Writer。这将是Servlet API公开的原始OutputStream/Writer

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


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

@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);
@ExceptionHandler(ApiException.class)
受保护的响应HandLeapeException(ApiException ex,Locale){
字符串defaultMessage=messages.getMessage(ex.errorMessage,ex.errorArgument,Locale.ENGLISH);
字符串localErrorMessage=messages.getMessage(ex.errorMessage,ex.errorArgument,defaultMessage,locale);

作为一般注意事项,请确保不要国际化实际的错误代码,而只国际化人工指导的解释信息。还请注意,使用
HttpHeaders
中的值比重新定义更为惯用。根据控制器的建议,使用
@RequestHeader
是可以的。但他也可以使用
WebRequest
来获取header的值是正确的,如果您能说出它抛出exception@chrylisThis同样有效。我知道我也可以直接将
区域设置作为注入参数!不要听chylis的话;他们没有读过问题。或者通过方法参数注入。这确实有效。@chrylis No-injection-via-method参数不起作用。@chrylis No-injection-via-method-parameter工作,这首先引发了这个问题。你读过这个问题吗?@Chloe明确地将
Locale
列为支持的参数。如果这不起作用,那么提交一个bug绝对值得。