当前位置: 首页 > 面试题库 >

谁在S​​pring MVC(@ResponseBody)中设置响应内容类型

海岳
2023-03-14
问题内容

我在注释驱动的Spring MVC Java Web应用程序中运行在Jetty Web服务器上运行(当前在Maven Jetty插件中)。

我正在尝试使用一种仅返回String帮助文本的控制器方法来提供一些AJAX支持。资源采用UTF-8编码,字符串也采用UTF-8编码,但是我来自服务器的回复是

content-encoding: text/plain;charset=ISO-8859-1

即使我的浏览器发送

Accept-Charset  windows-1250,utf-8;q=0.7,*;q=0.7

我正在以某种方式使用spring的默认配置

我发现了将这个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>

但是,使用此方法必须重新定义all 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 MVC Java Web应用程序中运行在Jetty Web服务器上运行(当前在Maven Jetty插件中)。 我正在尝试使用一种仅返回String帮助文本的控制器方法来提供一些AJAX支持。资源采用UTF-8编码,字符串也采用UTF-8编码,但是我来自服务器的回复是 即使我的浏览器发送 我正在以某种方式使用spring的默认配置 我发现了将这个bean添加

  • 问题内容: 因此,我在Struts2中使用freemarker模板来制定我的响应。但是,由于我也尝试使用taconite,因此需要使用“ text / xml”的内容类型发送响应。我似乎找不到使用freemarker指令设置内容类型的方法,而且我对Struts并不精通,无法知道是否有办法通过它来完成。 那么,我应该怎么做呢? 问题答案: 或者您可以在struts.xml中进行设置

  • 我在请求处理程序周围编写了一种包装器,使它们流式传输HTTP响应。我现在得到的是 处理程序响应包装器: 控制器: 我所做的只是每隔半秒发送一个空字符串,以保持请求的活动状态。某些工具需要在超时时不关闭它。这里的问题是,我在响应中没有看到任何内容类型头。尽管我从我的控制器方法返回ResponseEntity,但什么都没有,正如这条线程中所说: https://github.com/spring-pr

  • Spring Boot中REST APIendpoint(控制器类或方法)上的响应内容类型可以使用@Produces注释进行设置。是否有一种方法可以将此应用程序wide设置为REST API中每个endpoint的默认值?例如,与其在每个控制器类或endpoint上编写@produces(“application/json”),还可以在入口应用程序类上设置它吗?或者有没有其他方法来配置默认值,直到

  • 我实现了一个API,它将根据客户的请求返回JSON和XML(即接受请求中的头)。它像预期的那样工作。 这里的问题是:即使用户发送接受标头,在一些特殊情况下(即业务逻辑),我们也需要动态发送响应内容类型。我试图使用HttpHeaders实现它,但它不起作用。 我将HTTP状态设置为200,但响应为错误,即, 如何解决这个问题?

  • null 当我创建正文部分时,我是否应该显式地设置top mime消息的内容类型,然后设置每个正文部分? 如果是,在上面的例子中它们应该是什么? 对于html建议,对于附件建议,对于内联建议。我正在使用所有这些,那么对于完整的消息和不同的主体部分应该是什么内容类型? 通过上面的代码,我得到了正确的html文本,纯文本,内联图像和附件在正确的地方与James集成的ThunderBird。 因此,我不