나는 Annotation에서 스프링 MVC 자바 웹 애플리케이션을 부두 웹 서버 (현재 Maven jetty Plugin에있다.)에 구동시키고있다.
내가 문자열 도움말 텍스트를 반환하는 하나의 컨트롤러 메소드로 일부 AJAX 지원을하려고합니다. 리소스는 UTF-8 인코딩이므로 문자열이지만 서버의 응답은 다음과 같습니다.
content-encoding: text/plain;charset=ISO-8859-1
내 브라우저에서 보내는 경우에도
Accept-Charset windows-1250,utf-8;q=0.7,*;q=0.7
어떻게 든 봄의 기본 구성을 사용하고 있습니다.
구성에이 bean을 추가하는 힌트를 찾았으나 인코딩을 지원하지 않으며 기본값을 대신 사용하기 때문에이 bean을 사용하지 않을 것이라고 생각합니다.
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/plain;charset=UTF-8" />
</bean>
내 컨트롤러 코드는 다음과 같습니다 (이 응답 유형 변경이 작동하지 않습니다).
@RequestMapping(value = "ajax/gethelp")
public @ResponseBody String handleGetHelp(Locale loc, String code, HttpServletResponse response) {
log.debug("Getting help for code: " + code);
response.setContentType("text/plain;charset=UTF-8");
String help = messageSource.getMessage(code, null, loc);
log.debug("Help is: " + help);
return help;
}
스프링 3.1에 대한 해결책을 찾았습니다. @ResponseBody 주석을 사용하여. 다음은 Json 출력을 사용하는 컨트롤러의 예입니다.
@RequestMapping(value = "/getDealers", method = RequestMethod.GET,
produces = "application/json; charset=utf-8")
@ResponseBody
public String sendMobileData() {
}
다음과 같은 방법으로 인코딩을 설정할 수도 있습니다.
@RequestMapping(value = "ajax/gethelp")
public ResponseEntity<String> handleGetHelp(Locale loc, String code, HttpServletResponse response) {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Type", "text/html; charset=utf-8");
log.debug("Getting help for code: " + code);
String help = messageSource.getMessage(code, null, loc);
log.debug("Help is: " + help);
return new ResponseEntity<String>("returning: " + help, responseHeaders, HttpStatus.CREATED);
}
나는 StringHttpMessageConverter를 사용하는 것이 이것보다 낫다고 생각한다.
최근에이 문제와 싸우고 있었고 Spring 3.1에서 사용할 수있는 답변이 훨씬 많았습니다.
@RequestMapping(value = "ajax/gethelp", produces = "text/plain")
따라서 JAX-RS만큼이나 쉽고 간단하게 모든 주석을 표시 할 수 있습니다.
컨트롤러를 통해 보내고있는 응답의 유형을 나타 내기 위해 produce를 사용할 수 있습니다. 이 "produce"키워드는 아약스 요청에서 가장 유용 할 것이고 프로젝트에서 매우 도움이 될 것입니다.
@RequestMapping(value = "/aURLMapping.htm", method = RequestMethod.GET, produces = "text/html; charset=utf-8")
public @ResponseBody String getMobileData() {
}
감사합니다 digz6666, json을 사용하기 때문에 약간의 변경 사항이 적용되어 솔루션이 작동합니다.
responseHeaders.add("Content-Type", "application/json; charset=utf-8");
axtavt (당신이 추천 한)에 의해 주어진 대답은 나를 위해 일하지 않을 것이다. 올바른 미디어 유형을 추가 했더라도 :
if (conv instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) conv).setSupportedMediaTypes(
Arrays.asList(
new MediaType("text", "html", Charset.forName("UTF-8")),
new MediaType("application", "json", Charset.forName("UTF-8")) ));
}
package com.your.package.spring.fix;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
/**
* @author Szilard_Jakab (JaKi)
* Workaround for Spring 3 @ResponseBody issue - get incorrectly
encoded parameters from the URL (in example @ JSON response)
* Tested @ Spring 3.0.4
*/
public class RepairWrongUrlParamEncoding {
private static String restoredParamToOriginal;
/**
* @param wrongUrlParam
* @return Repaired url param (UTF-8 encoded)
* @throws UnsupportedEncodingException
*/
public static String repair(String wrongUrlParam) throws
UnsupportedEncodingException {
/* First step: encode the incorrectly converted UTF-8 strings back to
the original URL format
*/
restoredParamToOriginal = URLEncoder.encode(wrongUrlParam, "ISO-8859-1");
/* Second step: decode to UTF-8 again from the original one
*/
return URLDecoder.decode(restoredParamToOriginal, "UTF-8");
}
}
이 문제에 대한 많은 해결 방법을 시도한 후에 나는 이것을 생각하고 정상적으로 작동합니다.
"문자 인코딩이 지정되지 않은 경우 서블릿 사양에서는 ISO-8859-1의 인코딩이 사용되어야합니다."Spring 3.1 이상을 사용하는 경우 fallowing 구성을 사용하여 charset = UTF-8을 다음으로 설정합니다. 응답 본문
@RequestMapping (value = "귀하의 매핑 url", 생성 = "text / plain; charset = UTF-8")
public final class ConfigurableStringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
private Charset defaultCharset;
public Charset getDefaultCharset() {
return defaultCharset;
}
private final List<Charset> availableCharsets;
private boolean writeAcceptCharset = true;
public ConfigurableStringHttpMessageConverter() {
super(new MediaType("text", "plain", StringHttpMessageConverter.DEFAULT_CHARSET), MediaType.ALL);
defaultCharset = StringHttpMessageConverter.DEFAULT_CHARSET;
this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
}
public ConfigurableStringHttpMessageConverter(String charsetName) {
super(new MediaType("text", "plain", Charset.forName(charsetName)), MediaType.ALL);
defaultCharset = Charset.forName(charsetName);
this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
}
/**
* Indicates whether the {@code Accept-Charset} should be written to any outgoing request.
* <p>Default is {@code true}.
*/
public void setWriteAcceptCharset(boolean writeAcceptCharset) {
this.writeAcceptCharset = writeAcceptCharset;
}
@Override
public boolean supports(Class<?> clazz) {
return String.class.equals(clazz);
}
@Override
protected String readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException {
Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType());
return FileCopyUtils.copyToString(new InputStreamReader(inputMessage.getBody(), charset));
}
@Override
protected Long getContentLength(String s, MediaType contentType) {
Charset charset = getContentTypeCharset(contentType);
try {
return (long) s.getBytes(charset.name()).length;
}
catch (UnsupportedEncodingException ex) {
// should not occur
throw new InternalError(ex.getMessage());
}
}
@Override
protected void writeInternal(String s, HttpOutputMessage outputMessage) throws IOException {
if (writeAcceptCharset) {
outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());
}
Charset charset = getContentTypeCharset(outputMessage.getHeaders().getContentType());
FileCopyUtils.copy(s, new OutputStreamWriter(outputMessage.getBody(), charset));
}
/**
* Return the list of supported {@link Charset}.
*
* <p>By default, returns {@link Charset#availableCharsets()}. Can be overridden in subclasses.
*
* @return the list of accepted charsets
*/
protected List<Charset> getAcceptedCharsets() {
return this.availableCharsets;
}
private Charset getContentTypeCharset(MediaType contentType) {
if (contentType != null && contentType.getCharSet() != null) {
return contentType.getCharSet();
}
else {
return defaultCharset;
}
}
}
샘플 구성 :
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<util:list>
<bean class="ru.dz.mvk.util.ConfigurableStringHttpMessageConverter">
<constructor-arg index="0" value="UTF-8"/>
</bean>
</util:list>
</property>
</bean>