• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

Failed to convert value of type 'java.lang.String' to required type 'java.util.Locale 오류 문의

22.02.11 17:10 작성 조회수 1.29k

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요 강사님 POSTMAN에서 Accept-Language에 값을 아무것도 설정 안하거나 en으로 설정했을때 다국어 처리가 잘 되는 것을 확인할 수 있었습니다.
 
이번에는 호기심에 크롬에서 URI를 입력하고 테스트를 해봤는데
제 예상으로는 한국어로 브라우저에 결과값이 찍혀야 되는데
 
Boot로그를 보니 다음과 같은 에러를 확인할 수 있었습니다.
 
로그를 보고 크롬 개발자 Accept-Language 헤더 값을 살펴본 결과 요청 헤더의 Accept-Language 값에 다음과 같이 값을 포함하고 있는 것을 확인하였습니다.
 
이럴 경우 부트에서 파싱을 못해서 저런 상황이 발생하는 것 같은데 해결방법이 있을까요?
 
구글링을 해보니깐 헤더 말고 쿼리 파라미터를 이용해서 ISO언어코드를 넘겨서 처리하는 방법이 있던데
 
헤더로 넘길 경우 이렇게 발생할 에러에 대비해서 쿼리파라미터로 처리 방식으로 바꿔야 하는지 궁금합니다
 

답변 1

답변을 작성해보세요.

1

안녕하세요, 이도원입니다. 

문의하신 작업은 AcceptHeaderLocaleResolver 클래스를 이용하시면 처리할 수 있습니다. 다음과 같은 LocaleResolver를 구현하신 다음, 

public class AcceptHeaderResolver extends AcceptHeaderLocaleResolver {
List<Locale> LOCALES = Arrays.asList(new Locale("en"), new Locale("ar"));

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

컨트롤러에서는 @RequestHeader를 이용하여 Locale을 사용하지 마시고, 다음과 같이 HttpServletRequest를 이용하여 "Accept-Language" 값을 얻은 다음에, 정상적으로 처리되게 하실 수 있습니다. 

@GetMapping(path = "/test-world-internationalized")
public String testWorldInternationalizedWithoutHeader(HttpServletRequest request) {
String acceptLanguage = request.getHeader("Accept-Language");
System.out.println(acceptLanguage);
Locale locale = resolver.resolveLocale(request);
return messageSource.getMessage("greeting.message", null, locale);
}

위와 같이 구현하시면, 크롬에서 요청 시 다음과 같이 Accept-Language가 전달된다 하더라도, 

ko,en-US;q=0.9,en;q=0.8

AcceptHeaderResolver 클래스의 resolveLocale 메소드에서 해당 값을 Parsing하여 사용할 수 있습니다. 

감사합니다. 

감사합니다