简单的text/html无法解析解决记录
1. bug发现
我们所有的服务都是微服务,服务间调用都是使用feign接口进行调用,正常调用都没有问题,但是某一天发现部分从esb服务调用过来到我们本地的服务,本地服务再使用feign接口调用其他微服务子模块时候,返回信息报错,提示信息如下:
could not extract response: no suitable HttpMessageConverter found for response type [cn.git.query.dto.CheckDTO] and content type [text/html;charset=UTF-8]
2. 解决方法
我们从esb调用服务过来,本身我们自己的转发网关接收text/json类型的请求也是处理不了的,所以添加了对应的处理类WebMvcConfig,具体如下
package cn.git.server.config;import cn.git.api.util.NewCoreProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import java.util.ArrayList;
import java.util.List;/*** 解决text/json无法识别问题* @program: bank-credit-sy* @author: lixuchun* @create: 2022-02-10*/
@Configuration
public class WebMvcConfig {/*** 新增请求类型* @return MappingJackson2HttpMessageConverter 处理类*/@Beanpublic MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();//设置MediaTypeList<MediaType> list = new ArrayList<>();list.add(MediaType.APPLICATION_JSON_UTF8);// text/json;charset=UTF-8list.add(MediaType.valueOf(NewCoreProperties.RESPONSE_TYPE_TEXT_JSON));mappingJackson2HttpMessageConverter.setSupportedMediaTypes(list);return mappingJackson2HttpMessageConverter;}}
我们的响应类型,则设置了text/html;charset=UTF-8,其中 RESPONSE_TYPE_TEXT = “text/html;charset=UTF-8”,此处响应类型text/html与微服务的响应类型不匹配,无法解析报错,此处信息无法修改,所以需要修改接口调用api部分 具体代码为:
最终为了方便处理,使用了produces ,定了此端点在成功处理请求后,响应的内容类型应该是指定格式,一般为APPLICATION_JSON_VALUE,具体修改代码如下:
/*** 校验该柜员是否存在未制定贷款到期前或到期后处置计划的贷款* @param checkDTO userCd 柜员编号 orgCd 机构编号* @return String 0-不存在可以发起 1-存在记录不允许发起*/@ApiOperation(value = "校验是否存在未制定贷款到期前或到期后处置计划的贷款", notes = "校验是否存在未制定贷款到期前或到期后处置计划的贷款")@ApiResponses({@ApiResponse(code = 1, message = "OK", response = String.class),@ApiResponse(code = -1, message = "ERROR", response = CommonDbInfoDTO.class)})@PostMapping(value = "/checkDisposalPlan", produces = {MediaType.APPLICATION_JSON_VALUE})CheckDTO checkDisposalPlan(@RequestBody CheckDTO checkDTO);/*** 校验柜员是否进行准入* 该柜员没有准入,请联系管理员!* @param userCd 客户经理柜员号 specificLoanType 贷款品种* @return Boolean true-准入 false-没准入(提示)*/@ApiOperation(value = "校验柜员是否准入", notes = "校验柜员是否准入")@ApiResponses({@ApiResponse(code = 1, message = "OK", response = String.class),@ApiResponse(code = -1, message = "ERROR", response = CommonDbInfoDTO.class)})@PostMapping(value ="/checkUserStatus/{userCd}/{specificLoanType}", produces = {MediaType.APPLICATION_JSON_VALUE})Boolean checkUserStatus(@PathVariable(value = "userCd") String userCd,@PathVariable(value = "specificLoanType") String specificLoanType);
其中produces主要作用如下:
- 内容协商:当客户端发起请求时,可能会在请求头中包含Accept字段,表明它可以接受哪些类型的响应内容。服务器会根据客户端的偏好和produces指定的内容类型进行匹配,从而决定返回哪种类型的内容给客户端。这样可以确保客户端能够理解并处理接收到的数据
- 自动序列化:在Spring应用中,比如当指定了响应类型为application/json时,Spring会自动使用如Jackson这样的库将Java对象转换成JSON格式的字符串,然后作为响应体返回。这对于RESTful API而言非常有用,因为JSON是一种广泛支持的数据交换格式
- 清晰的API契约:明确指定响应类型可以让API的使用者清楚地知道该接口会返回什么类型的数据,有助于前后端分离开发和第三方集成