谁在春季 MVC 中设置响应内容类型(@ResponseBody)

我在我的注释驱动的Spring MVC Java Web应用程序中运行在jetty Web服务器(目前在maven jetty插件中)。

我正在尝试使用一个控制器方法仅返回字符串帮助文本来执行一些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 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;
}

答案 1

我找到了Spring 3.1的解决方案。使用@ResponseBody注释。下面是使用 Json 输出的控制器示例:

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

}

答案 2

简单的bean声明是不够的,你需要把它注入到:StringHttpMessageConverterAnnotationMethodHandlerAdapter

<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>

但是,使用此方法必须重新定义所有 s,并且它不适用于 。HttpMessageConverter<mvc:annotation-driven />

因此,也许最方便但丑陋的方法是拦截 with 的实例化:AnnotationMethodHandlerAdapterBeanPostProcessor

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 " />

推荐