@ResponseBody对content-type进行重写

1.@ResponseBody注解作用

    @ResponseBody注解的作用是将Controller方法返回的对象通过适当的转换器(HttpMessageConverter)转换为指定的格式,并将其写入到response对象的body区,一般都是用来返回JSON数据或者XML数据。在使用此注解后,SpringMVC将不会再走视图处理器(即当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象),而是直接将数据写入到流中,它的效果等同于通过response对象输出指定格式的数据。

2.业务需求:

    项目需求是:系统管理端需要将查询出来的数据导出并下载,下载的格式是excle。

    原本的处理方式:后端提供两个接口,一个export接口,用于将数据导出到excle文件中,返回数据中会提供需要下载的文件名;一个download接口,通过export接口返回的下载文件名,请求download接口下载。

    遇到的问题:在测试环境下,由于是单台服务器,前端通过连续的两次请求都会请求到同一台服务器上,所以不会有问题。但是当将项目部署到现网环境后,由于是分布式的环境,会出现同一个客户端两次连续的请求到了两台不同的服务器上,导致下载的文件没有相关的数据。

    解决方法:将两个接口合并为一个接口进行请求处理。

    再次遇到的问题:由于原先export接口返回给前端的是通过@ResponseBody,以JSON字符串的形式返回给前端,在download接口中,是通过HttpServletResponse中流的形式返回给前端,在download接口中设置了一些头的属性如下图所示,提供前端下载excle文件,在合并后新的接口中,还是使用了@ResponseBody进行了接口请求成功与否的相关返回说明,但是浏览器并没有产生下载行为

    解决过程:通过f12查看前端请求详情的时候,发现Content-Type属性及相关属性设置都没起作用,如下图所示,后来考虑到@ResponseBody注解是否会修改相关的响应头信息,将Content-Type属性设置为了application/json;charset=UTF-8,在去除注解后,能成功下载,相关请求头设置成功。

                        

<think>好的,我需要帮助用户在Spring Boot中配置支持text/plain的请求和响应。根据用户的问题,他们可能遇到了编码问题,比如乱码,或者希望正确设置处理text/plain的媒体类型。 首先,用户提到引用了三个资料,其中引用[3]涉及解决text/plain编码导致的乱码问题。里面提到了配置StringHttpMessageConverter并设置supportedMediaTypes为text/plain;charset=UTF-8。这应该是关键点。在Spring Boot中,通常通过配置MessageConverters来处理不同的媒体类型。 接下来,我需要考虑如何在Spring Boot中自定义消息转换器。用户可能需要覆盖configureMessageConverters或extendMessageConverters方法。这里要注意,直接添加新的StringHttpMessageConverter可能会覆盖默认的配置,所以可能需要先检查现有的转换器,或者调整顺序。 另外,用户可能需要处理请求和响应中的Content-Type头。确保服务器能正确解析接收到的text/plain请求,并以正确的字符集(如UTF-8)响应。同时,可能需要在配置中设置字符编码过滤器,比如CharacterEncodingFilter,来强制使用UTF-8。 还有,用户的问题可能涉及到HTTP客户端如何发送text/plain请求。比如使用RestTemplate时,需要设置Accept和Content-Type头,或者使用HttpClient进行配置。但根据用户的问题,他们更关注服务端的配置,所以重点应放在Spring Boot服务端的设置上。 最后,测试配置是否生效,可以通过编写控制器返回字符串,或者使用Postman发送请求,检查响应头的Content-Type和字符编码是否正确。同时,处理请求时,确保@RequestBody能正确解析text/plain内容,而@ResponseBody能正确生成响应。 总结步骤:配置StringHttpMessageConverter的supportedMediaTypes为UTF-8的text/plain,添加字符编码过滤器,可能需要在配置类中调整消息转换器的顺序,并测试验证。</think>在Spring Boot中配置支持text/plain的请求响应,需要通过自定义消息转换器设置字符编码和媒体类型。以下是具体实现步骤: ### 一、配置消息转换器 在配置类中重写`configureMessageConverters`方法,显式声明`StringHttpMessageConverter`并指定字符集: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { StringHttpMessageConverter converter = new StringHttpMessageConverter(StandardCharsets.UTF_8); converter.setSupportedMediaTypes(Collections.singletonList(MediaType.TEXT_PLAIN)); converters.add(0, converter); // 优先使用自定义转换器 } } ``` ### 二、强制响应编码 在`application.properties`中添加配置强制UTF-8编码: ```properties spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true spring.http.encoding.force=true ``` ### 三、控制器示例 ```java @RestController public class DemoController { @PostMapping(value = "/text", consumes = MediaType.TEXT_PLAIN_VALUE, produces = MediaType.TEXT_PLAIN_VALUE) public String handleText(@RequestBody String content) { return "处理结果:" + content; } } ``` ### 四、验证请求示例 使用curl测试: ```bash curl -X POST -H "Content-Type: text/plain" -d "测试数据" http://localhost:8080/text ``` ### 关键配置说明 1. `StringHttpMessageConverter`默认使用ISO-8859-1编码,必须显式设置UTF-8[^3] 2. `consumes/produces`注解属性明确声明媒体类型 3. 配置转换器顺序确保优先级(`converters.add(0, ...)`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值