[java] Spring MVC에서 응답 컨텐츠 유형을 설정하는 사람 (@ResponseBody)

Annotation 기반의 Spring MVC Java 웹 응용 프로그램을 부두 웹 서버 (현재 maven jetty plugin)에서 실행하고 있습니다.

String 도움말 텍스트 만 반환하는 하나의 컨트롤러 메소드로 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;
}



답변

StringHttpMessageConverterBean 의 간단한 선언으로는 충분하지 않으므로 다음에 삽입해야합니다 AnnotationMethodHandlerAdapter.

<bean class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <array>
            <bean class = "org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />
            </bean>
        </array>
    </property>
</bean>

그러나이 방법을 사용하면 모든을 재정의해야하며 HttpMessageConverter작동하지 않습니다 <mvc:annotation-driven />.

따라서 가장 편리하지만 추악한 방법은 AnnotationMethodHandlerAdapterwith의 인스턴스를 가로채는 것 입니다 BeanPostProcessor.

public class EncodingPostProcessor implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String name)
            throws BeansException {
        if (bean instanceof AnnotationMethodHandlerAdapter) {
            HttpMessageConverter<?>[] convs = ((AnnotationMethodHandlerAdapter) bean).getMessageConverters();
            for (HttpMessageConverter<?> conv: convs) {
                if (conv instanceof StringHttpMessageConverter) {
                    ((StringHttpMessageConverter) conv).setSupportedMediaTypes(
                        Arrays.asList(new MediaType("text", "html",
                            Charset.forName("UTF-8"))));
                }
            }
        }
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String name)
            throws BeansException {
        return bean;
    }
}

<bean class = "EncodingPostProcessor " />


답변

Spring 3.1에 대한 솔루션을 찾았습니다. @ResponseBody 주석을 사용하여. 다음은 Json 출력을 사용하는 컨트롤러의 예입니다.

@RequestMapping(value = "/getDealers", method = RequestMethod.GET,
produces = "application/json; charset=utf-8")
@ResponseBody
public String sendMobileData() {

}


답변

Spring MVC 3.1에서는 MVC 네임 스페이스를 사용하여 메시지 변환기를 구성 할 수 있습니다.

<mvc:annotation-driven>
  <mvc:message-converters register-defaults="true">
    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
      <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />
    </bean>
  </mvc:message-converters>
</mvc:annotation-driven>

또는 코드 기반 구성 :

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

  private static final Charset UTF8 = Charset.forName("UTF-8");

  @Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
    stringConverter.setSupportedMediaTypes(Arrays.asList(new MediaType("text", "plain", UTF8)));
    converters.add(stringConverter);

    // Add other converters ...
  }
}


답변

다음과 같은 방법으로 인코딩을 설정할 수도 있습니다.

@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를 사용하는 것이 이것보다 낫다고 생각합니다.


답변

RequestMapping에 produce = “text / plain; charset = UTF-8″을 추가 할 수 있습니다

@RequestMapping(value = "/rest/create/document", produces = "text/plain;charset=UTF-8")
@ResponseBody
public String create(Document document, HttpServletRespone respone) throws UnsupportedEncodingException {

    Document newDocument = DocumentService.create(Document);

    return jsonSerializer.serialize(newDocument);
}

자세한 내용은이 블로그를 참조하십시오


답변

나는 최근 에이 문제와 싸우고 있었고 Spring 3.1에서 훨씬 더 나은 대답을 찾았습니다.

@RequestMapping(value = "ajax/gethelp", produces = "text/plain")

따라서 모든 의견과 마찬가지로 JAX-RS만큼 쉽게 할 수 있습니다.


답변

농작물을 사용하여 컨트롤러에서 보내는 응답의 유형을 나타낼 수 있습니다. 이 “produces”키워드는 아약스 요청에서 가장 유용하며 내 프로젝트에서 매우 유용했습니다.

@RequestMapping(value = "/aURLMapping.htm", method = RequestMethod.GET, produces = "text/html; charset=utf-8")

public @ResponseBody String getMobileData() {

}