簡單的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的使用者清楚地知道該接口會返回什么類型的數據,有助于前后端分離開發和第三方集成