简单的text/html无法解析解决记录

简单的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 处理类
     */
    @Bean
    public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        //设置MediaType
        List<MediaType> list = new ArrayList<>();
        list.add(MediaType.APPLICATION_JSON_UTF8);
        // text/json;charset=UTF-8
        list.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的使用者清楚地知道该接口会返回什么类型的数据,有助于前后端分离开发和第三方集成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值