스프링 RestTemplate Content-Type 관련 질문 드립니다.

7,894 views
Skip to first unread message

고종봉

unread,
Mar 8, 2011, 9:30:27 PM3/8/11
to ks...@googlegroups.com
안녕하세요? 날씨가 많이 풀리고 있죠?ㅎ


제목 그대로,, 스프링 RestTemplate에 Content-Type을 설정 하는 방법을 문의드립니다.

String result = restTemplate.postForObject(URI.create("http://localhost:9000/provider/rest/post.do"), "<DATA>POST 한글</DATA>", String.class);

이렇게 보내면,

POST /provider/rest/post.do HTTP/1.1
Accept: text/plain, */*
Content-Type: text/plain;charset=ISO-8859-1
..

이렇게 charset이 기본적으로 ISO-8859-1로 전송되네요.. UTF-8을 사용하고 싶은데,,

어떤 좋은 방법이 있을까요??

황지환

unread,
Mar 8, 2011, 9:50:49 PM3/8/11
to Korea Spring User Group
안녕하세요?

http://helols.tistory.com/397 참조하시면 될것 같습니다.

MappingJacksonHttpMessageConverter 이거는 default 가 utf-8 이네요.

On 3월9일, 오전11시30분, 고종봉 <mercujj...@gmail.com> wrote:
> 안녕하세요? 날씨가 많이 풀리고 있죠?ㅎ
>
> 제목 그대로,, 스프링 RestTemplate에 Content-Type을 설정 하는 방법을 문의드립니다.
>
> String result = restTemplate.postForObject(URI.create("http://localhost:9000/provider/rest/post.do"), "<DATA>POST 한글</DATA>",
> String.class);
>
> 이렇게 보내면,
>
> POST /provider/rest/post.do HTTP/1.1
> Accept: text/plain, */*

> Content-Type: text/plain;*charset=ISO-8859-1*

Sewon Ann

unread,
Mar 8, 2011, 9:52:19 PM3/8/11
to ks...@googlegroups.com, 고종봉
postForObject() 소스를 봤는데, 결과로 받을 타입이 String.class 일 경우 org.springframework.http.converter.StringHttpMessageConverter 가 담당을 하네요. 
(RestTemplate,139 line)

근데 소스를 보니 DEFAULT_CHARSET 이 ISO-8859-1 로 되어있습니다.
제가 보기엔 이 클래스 자체를 뭔가 수정해서 쓰는 것은 배보다 배꼽이 더 큰 것 같아요.
물론 테스트 정도가 아니라 서비스 자체에서 restTemplate 을 쓴다면 그런 경우까지 고려할 수 있겠지만요.

그래서 인코딩 까지 고려하실 경우엔 단순히 <DATA>POST 한글</DATA> 만 보내지 마시고 header 까지 담을 수 있는 HttpEntity 로 만드시는 건 어떨까 생각합니다.
HttpEntity(T body, MultiValueMap<String, String> headers) 이런 생성자가 제공됩니다.

따라서 호출이 이런식으로 바뀌겠죠. (정확하진 않습니다.)

MultValueMap headerMap = ...  <= 여기에 Content-Type 헤더를 UTF-8로 넣어주기

String result = restTemplate.postForObject(URI.create("http://localhost:9000/provider/rest/post.do"), new HttpEntity( "<DATA>POST 한글</DATA>", headerMap ), String.class);

제가 이렇게 생각한 이유는 RestTemplate 291 line -> 541 line -> HttpEntity 95 line 으로 따라갔기 때문입니다.


2011/3/9 고종봉 <mercu...@gmail.com>

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.

Im Yoon

unread,
Mar 8, 2011, 9:56:28 PM3/8/11
to ks...@googlegroups.com
restTemplate는 단순히 템플릿이구요..

메세지 전송하는거는 컨버터들 통해서 하는데 ..
컨버터에 보면 세팅하는게 있어욤~

On 2011. 3. 8., at 오후 6:30, 고종봉 wrote:

> restTemplate.postForObject

Thanks!
Im Yoon!!
helol...@gmail.com

Im Yoon

unread,
Mar 8, 2011, 9:59:59 PM3/8/11
to ks...@googlegroups.com
어디서 마니 본 url이라고 생각했는데;;; 쿨럭;;
anyway 
@종봉님 . 해보시고 안되시면 GT로 핑주세요.. 허접하지만 회사소스 쏴드릴께요..;; 


On 2011. 3. 8., at 오후 6:50, 황지환 wrote:

http://helols.tistory.com/397 참조하시면 될것 같습니다.

Thanks!
Im Yoon!!
helol...@gmail.com





고종봉

unread,
Mar 9, 2011, 3:47:47 AM3/9/11
to ks...@googlegroups.com
메일이 한분께만 가서 다시 공유합니다. ^^;

---------- 전달된 메시지 ----------
보낸사람: 고종봉 <mercu...@gmail.com>
날짜: 2011년 3월 9일 오후 5:24
제목: Re: [KSUG] 스프링 RestTemplate Content-Type 관련 질문 드립니다.
받는사람: Sewon Ann <kin...@gmail.com>


휴우.. 땀 나네요..

답변 달아 주신 분들 감사합니다. ^^;

답변 주신 힌트를 근거로 소스를 분석해봤는데요,

디버깅해본 결과 세원님이 말씀하신 것처럼 StringHttpMessageConverter에서 매칭되서 컨버팅이 수행됩니다.

그런데,, 여기서 문제가.. 

해당 컨버터를 개발한 담당자들의 캐릭터셋에 대한 배려가 부족해서인지,, "ISO-8859-1"을 디폴트로 박아놨더군요.. 

그리고 수정할 수 있는 여지도 제공하지 않은 것 같구요..

아래는 해당 소스 부분입니다.

public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {

public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

private final List<Charset> availableCharsets;

public StringHttpMessageConverter() {
super(new MediaType("text", "plain", DEFAULT_CHARSET), MediaType.ALL);
this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
}
..

setCharset() 비스므리한 것도 없습니다...

FormHttpMessageConverter의 경우에도, API 문서에는 setCharset(Charset)이 정의되어 있는데,, 소스에는 없습니다. 헉~!! 


결과적으로 현재 제가 소스를 파악해본 바로는,, java.lang.String 타입인 경우에는 기본적으로 "ISO-8859-1" 캐릭터셋만 먹도로 되어 있기 때문에...

ㅠㅠ;;

좀더 찾아봐야 겠습니다..

2011년 3월 9일 오전 11:52, Sewon Ann <kin...@gmail.com>님의 말:

고종봉

unread,
Mar 9, 2011, 3:48:09 AM3/9/11
to ks...@googlegroups.com
---------- 전달된 메시지 ----------
보낸사람: 고종봉 <mercu...@gmail.com>
날짜: 2011년 3월 9일 오후 5:38

제목: Re: [KSUG] 스프링 RestTemplate Content-Type 관련 질문 드립니다.
받는사람: Sewon Ann <kin...@gmail.com>


자문자답입니다. 겨우 해결했습니다. ^^;;

여기 API 문서에 보면 supportedMediaTypes를 상속해서 쓰라고 되어 있네요.. ㅠㅠ;

근데,, 설정이 무척이나 길어졌네요.. 이게 최선입니까?? 확실해요?? ㅡㅡ;;

<bean id="restTemplate" class="org.springframework.security.oauth.consumer.OAuthRestTemplate"> <!-- RestTemplate을 상속 -->
..
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<bean class="org.springframework.http.MediaType">
<constructor-arg value="text"></constructor-arg>
<constructor-arg value="xml"></constructor-arg>
<constructor-arg>
<bean class="java.nio.charset.Charset" factory-method="forName">
<constructor-arg value="UTF-8"></constructor-arg>
</bean>
</constructor-arg>
</bean>
</list>
</property>
</bean>
</list>
</property>
</bean>

더 좋은 방법이 있다면 알려주세요~

2011년 3월 9일 오후 5:24, 고종봉 <mercu...@gmail.com>님의 말:
휴우.. 땀 나네요..

답변 달아 주신 분들 감사합니다. ^^;

답변 주신 힌트를 근거로 소스를 분석해봤는데요,

디버깅해본 결과 세원님이 말씀하신 것처럼 StringHttpMessageConverter에서 매칭되서 컨버팅이 수행됩니다.

그런데,, 여기서 문제가.. 

해당 컨버터를 개발한 담당자들의 캐릭터셋에 대한 배려가 부족해서인지,, "ISO-8859-1"을 디폴트로 박아놨더군요.. 

그리고 수정할 수 있는 여지도 제공하지 않은 것 같구요..

아래는 해당 소스 부분입니다.

public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {

public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

private final List<Charset> availableCharsets;

public StringHttpMessageConverter() {
super(new MediaType("text", "plain", DEFAULT_CHARSET), MediaType.ALL);
this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
}
..

setCharset() 비스므리한 것도 없습니다...

FormHttpMessageConverter의 경우에도, API 문서에는 setCharset(Charset)이 정의되어 있는데,, 소스에는 없습니다. 헉~!! 


결과적으로 현재 제가 소스를 파악해본 바로는,, java.lang.String 타입인 경우에는 기본적으로 "ISO-8859-1" 캐릭터셋만 먹도로 되어 있기 때문에...

ㅠㅠ;;

좀더 찾아봐야 겠습니다..

2011년 3월 9일 오전 11:52, Sewon Ann <kin...@gmail.com>님의 말:

고종봉

unread,
Mar 9, 2011, 3:48:23 AM3/9/11
to ks...@googlegroups.com
---------- 전달된 메시지 ----------
보낸사람: 고종봉 <mercu...@gmail.com>
날짜: 2011년 3월 9일 오후 5:44
제목: [KSUG] 스프링 RestTemplate Content-Type 관련 질문 드립니다.
받는사람: Sewon Ann <kin...@gmail.com>


자문자답은 아니군요..

결정적 힌트를 제공받았으니ㅎ

감사합니다~!

나의 GalaxyS로부터...

2011. 3. 9. 오후 5:38에 "고종봉" <mercu...@gmail.com>님이 작성:

> 자문자답입니다. 겨우 해결했습니다. ^^;;
>
> http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/http/converter/StringHttpMessageConverter.html
> 여기 API 문서에 보면 supportedMediaTypes를 상속해서 쓰라고 되어 있네요.. ㅠㅠ;
>
> 근데,, 설정이 무척이나 길어졌네요.. 이게 최선입니까?? 확실해요?? ㅡㅡ;;
>
> <bean id="restTemplate"
> class="org.springframework.security.oauth.consumer.OAuthRestTemplate"> <!--
> RestTemplate을 상속 -->
> ..
> <property name="messageConverters">
> <list>
> <bean class="org.springframework.http.converter.StringHttpMessageConverter">
> <property name="supportedMediaTypes">
> <list>
> <bean class="org.springframework.http.MediaType">
> <constructor-arg value="text"></constructor-arg>
> <constructor-arg value="xml"></constructor-arg>
> <constructor-arg>
> <bean class="java.nio.charset.Charset" factory-method="forName">
> <constructor-arg value="*UTF-8*"></constructor-arg>
>>>> Content-Type: text/plain;*charset=ISO-8859-1*

Sungchul Park

unread,
Mar 9, 2011, 4:08:54 AM3/9/11
to ks...@googlegroups.com
정리해서 KSUG 블로그에 올려주세요.

(토스3 모임 후기 쓰라는 누군가의 답글이 달릴 것 같은 느낌이...)


2011년 3월 9일 오후 5:24, 고종봉 <mercu...@gmail.com>님 의 말:
휴우.. 땀 나네요..

답변 달아 주신 분들 감사합니다. ^^;

답변 주신 힌트를 근거로 소스를 분석해봤는데요,

디버깅해본 결과 세원님이 말씀하신 것처럼 StringHttpMessageConverter에서 매칭되서 컨버팅이 수행됩니다.

그런데,, 여기서 문제가.. 

해당 컨버터를 개발한 담당자들의 캐릭터셋에 대한 배려가 부족해서인지,, "ISO-8859-1"을 디폴트로 박아놨더군요.. 

그리고 수정할 수 있는 여지도 제공하지 않은 것 같구요..

아래는 해당 소스 부분입니다.

public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {

public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

private final List<Charset> availableCharsets;

public StringHttpMessageConverter() {
super(new MediaType("text", "plain", DEFAULT_CHARSET), MediaType.ALL);
this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
}
..

setCharset() 비스므리한 것도 없습니다...

FormHttpMessageConverter의 경우에도, API 문서에는 setCharset(Charset)이 정의되어 있는데,, 소스에는 없습니다. 헉~!! 


결과적으로 현재 제가 소스를 파악해본 바로는,, java.lang.String 타입인 경우에는 기본적으로 "ISO-8859-1" 캐릭터셋만 먹도로 되어 있기 때문에...

ㅠㅠ;;

좀더 찾아봐야 겠습니다..

2011년 3월 9일 오전 11:52, Sewon Ann <kin...@gmail.com>님 의 말:

postForObject() 소스를 봤는데, 결과로 받을 타입이 String.class 일 경우 org.springframework.http.converter.StringHttpMessageConverter 가 담당을 하네요. 
(RestTemplate,139 line)

근데 소스를 보니 DEFAULT_CHARSET 이 ISO-8859-1 로 되어있습니다.
제가 보기엔 이 클래스 자체를 뭔가 수정해서 쓰는 것은 배보다 배꼽이 더 큰 것 같아요.
물론 테스트 정도가 아니라 서비스 자체에서 restTemplate 을 쓴다면 그런 경우까지 고려할 수 있겠지만요.

그래서 인코딩 까지 고려하실 경우엔 단순히 <DATA>POST 한글</DATA> 만 보내지 마시고 header 까지 담을 수 있는 HttpEntity 로 만드시는 건 어떨까 생각합니다.
HttpEntity(T body, MultiValueMap<String, String> headers) 이런 생성자가 제공됩니다.

따라서 호출이 이런식으로 바뀌겠죠. (정확하진 않습니다.)

MultValueMap headerMap = ...  <= 여기에 Content-Type 헤더를 UTF-8로 넣어주기

String result = restTemplate.postForObject(URI.create("http://localhost:9000/provider/rest/post.do"), new HttpEntity( "<DATA>POST 한글</DATA>", headerMap ), String.class);

제가 이렇게 생각한 이유는 RestTemplate 291 line -> 541 line -> HttpEntity 95 line 으로 따라갔기 때문입니다.


2011/3/9 고종봉 <mercu...@gmail.com>
안녕하세요? 날씨가 많이 풀리고 있죠?ㅎ


제목 그대로,, 스프링 RestTemplate에 Content-Type을 설정 하는 방법을 문의드립니다.

String result = restTemplate.postForObject(URI.create("http://localhost:9000/provider/rest/post.do"), "<DATA>POST 한글</DATA>", String.class);

이렇게 보내면,

POST /provider/rest/post.do HTTP/1.1
Accept: text/plain, */*
Content-Type: text/plain;charset=ISO-8859-1
..

이렇게 charset이 기본적으로 ISO-8859-1로 전송되네요.. UTF-8을 사용하고 싶은데,,

어떤 좋은 방법이 있을까요??
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으) 로 이메일을 보내세요.

그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에 서 그룹을 방문하세요.

심상호

unread,
Mar 9, 2011, 4:41:12 AM3/9/11
to ks...@googlegroups.com
다른 해결책은 아니고 설정은 조금 더 간단히 할 수 있습니다.
 
  <bean id="conversionService"
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
 
  <bean id="stringHttpMessageConverter"
    class="org.springframework.http.converter.StringHttpMessageConverter"
    p:supportedMediaTypes="text/plain;charset=UTF-8,application/xml;charset=EUC-KR" />

찬욱

unread,
Mar 9, 2011, 5:05:20 AM3/9/11
to Korea Spring User Group
text/plain;charset=UTF-8으로 Accept를 지정해서 보내시면 됩니다(조회시)

고종봉

unread,
Mar 9, 2011, 5:07:28 AM3/9/11
to ks...@googlegroups.com
네,, 맞네요.. 제가 너무 장황하게 썼군요..

아래와 같이 설정해도 됩니다.

MediaType(String type) 생성자가 있었군요..

<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/xml; charset=UTF-8">
</property>
</bean>
</list>
</property>

또는 "p:supportedMediaTypes" 사용..

2011년 3월 9일 오후 6:41, 심상호 <shs...@crossent.com>님의 말:

--

고종봉

unread,
Mar 9, 2011, 5:08:49 AM3/9/11
to ks...@googlegroups.com
하하....^^; (땀.. 삐질..)


2011년 3월 9일 오후 6:08, Sungchul Park <gyu...@gmail.com>님의 말:

Sungchul Park

unread,
Mar 9, 2011, 5:16:56 AM3/9/11
to ks...@googlegroups.com

> text/plain;charset=UTF-8으로 Accept를 지정해서 보내시면 됩니다(조회시)
세미나 때 말씀하신 내용이죠?
ㅎㅎ

이게 가장 좋은 해법이라고 봅니다.

찬욱

unread,
Mar 9, 2011, 5:23:37 AM3/9/11
to Korea Spring User Group
이렇게 빨리 답글을 다시다니요^^.
도움이 되셨길 바래요~
Reply all
Reply to author
Forward
0 new messages