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
- WebRequest或NativeWebRequest。允许通用请求参数访问以及请求/会话属性访问,无需与本机Servlet API绑定
- 当前请求区域设置的区域设置(由可用的最特定的区域设置解析程序确定,即Servlet环境中配置的LocaleResolver)。 用于访问请求内容的InputStream/Reader。这将是Servlet API公开的原始InputStream/Reader
- 用于生成响应内容的OutputStream/Writer。这将是Servlet API公开的原始OutputStream/Writer
- 模型作为从处理程序方法返回模型映射的替代方法。请注意,提供的模型未预先填充常规模型属性,因此始终为空,以便为异常特定视图准备模型
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绝对值得。