-
카테고리
-
세부 분야
백엔드
-
해결 여부
해결됨
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 문의하기를 이용해주세요.
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요 강사님 POSTMAN에서 Accept-Language에 값을 아무것도 설정 안하거나 en으로 설정했을때 다국어 처리가 잘 되는 것을 확인할 수 있었습니다.
이번에는 호기심에 크롬에서 URI를 입력하고 테스트를 해봤는데
제 예상으로는 한국어로 브라우저에 결과값이 찍혀야 되는데
Boot로그를 보니 다음과 같은 에러를 확인할 수 있었습니다.
로그를 보고 크롬 개발자 Accept-Language 헤더 값을 살펴본 결과 요청 헤더의 Accept-Language 값에 다음과 같이 값을 포함하고 있는 것을 확인하였습니다.
이럴 경우 부트에서 파싱을 못해서 저런 상황이 발생하는 것 같은데 해결방법이 있을까요?
구글링을 해보니깐 헤더 말고 쿼리 파라미터를 이용해서 ISO언어코드를 넘겨서 처리하는 방법이 있던데
헤더로 넘길 경우 이렇게 발생할 에러에 대비해서 쿼리파라미터로 처리 방식으로 바꿔야 하는지 궁금합니다
[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
다국어 처리를 위한 Internationalization 구현 방법
강의실 바로가기
답변을 작성해보세요.
1
Dowon Lee
지식공유자2022.02.17
안녕하세요, 이도원입니다.
문의하신 작업은 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하여 사용할 수 있습니다.
감사합니다.
답변 1