fegin返回参数统一处理

相关版本:

xml 复制代码
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.3</version>
    </parent>
    
    <properties>
        <spring-cloud.version>2023.0.0</spring-cloud.version>
        <spring-cloud-alibaba.version>2023.0.0.0-RC1</spring-cloud-alibaba.version>
        <fastjson2.version>2.0.50</fastjson2.version>
    </properties>

创建模块feign

引入相关依赖:

xml 复制代码
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--必须与feign一起引入-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

        <dependency>
            <groupId>com.lease</groupId>
            <artifactId>model</artifactId>
            <version>1.0.0</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>
    </dependencies>

对feign返回结果统一处理

java 复制代码
/**
 * 自定义解析类
 * @author YuelongZhou
 * @date 2024/6/22
 */
public class MyResultDecoder implements Decoder {

    private final SpringDecoder decoder;

    public MyResultDecoder(SpringDecoder springDecoder) {
        this.decoder = springDecoder;
    }


    @Override
    public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException {
        Result result = JSON.parseObject(response.body().asReader(StandardCharsets.UTF_8), Result.class);
        Assert.isTrue(ResultStatusEnum.SUCCESS.getCode().equals(result.getCode()),"数据解析失败");
        String dataStr = JSON.toJSONString(result.getData());
        JavaType javaType = TypeFactory.defaultInstance().constructType(type);
        return new ObjectMapper().readValue(dataStr,javaType);
    }
}

添加feign拦截器,实现请求头上下文传递

java 复制代码
/**
 * @author YuelongZhou
 * @date 2024/6/22
 */
public class FeignRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String header = "access-token";
        String token = request.getHeader(header);
        requestTemplate.header(header,token);
    }
}

使上面2个配置生效

java 复制代码
@Configuration
@EnableFeignClients(basePackages = "com.lease.feign.client")
public class FeignConfig {

    @Bean
    public Decoder decoder(ObjectFactory<HttpMessageConverters> msgConverters, ObjectProvider<HttpMessageConverterCustomizer> customizers) {
        return new OptionalDecoder((new ResponseEntityDecoder(new MyResultDecoder(new SpringDecoder(msgConverters, customizers)))));
    }

    @Bean
    public RequestInterceptor feignRequestInterceptor() {
        return new FeignRequestInterceptor();
    }

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        return objectMapper;
    }

}

feign接口

java 复制代码
@FeignClient(
        value = FeignClientConstants.LEASE_WEB_ADMIN,
        path = "/admin/facility",
        contextId = "roomFacilityFeignClient"
)
public interface RoomFacilityFeignClient {

    @PostMapping("/getRoomFacilityListByRoomId")
    List<RoomFacility>getRoomFacilityListByRoomId(@RequestBody IdParam param);
}

服务controller接口

java 复制代码
    @Operation(summary = "根据房间id查询房间配套关联")
    @PostMapping("/getRoomFacilityListByRoomId")
    public Result<List<RoomFacility>>getRoomFacilityListByRoomId(@RequestBody IdParam param) {
        return ResultUtil.success(roomFacilityService.getRoomFacilityListByRoomId(param));
    }

若DTO中涉及LocalDateTime

java 复制代码
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)		// 反序列化
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    private LocalDateTime createTime;
相关推荐
麦兜*6 小时前
MongoDB 6.0 新特性解读:时间序列集合与加密查询
数据库·spring boot·mongodb·spring·spring cloud·系统架构
echoyu.1 天前
消息队列-初识kafka
java·分布式·后端·spring cloud·中间件·架构·kafka
AAA修煤气灶刘哥1 天前
缓存这「加速神器」从入门到填坑,看完再也不被产品怼慢
java·redis·spring cloud
AAA修煤气灶刘哥1 天前
接口又被冲崩了?Sentinel 这 4 种限流算法,帮你守住后端『流量安全阀』
后端·算法·spring cloud
T_Ghost1 天前
SpringCloud微服务服务容错机制Sentinel熔断器
spring cloud·微服务·sentinel
喂完待续1 天前
【序列晋升】28 云原生时代的消息驱动架构 Spring Cloud Stream的未来可能性
spring cloud·微服务·云原生·重构·架构·big data·序列晋升
惜.己2 天前
Docker启动失败 Failed to start Docker Application Container Engine.
spring cloud·docker·eureka
chenrui3102 天前
Spring Boot 和 Spring Cloud: 区别与联系
spring boot·后端·spring cloud
喂完待续3 天前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升