• 在SpringCloud中使用Feign的两种方式


    在SpringCloud中通常使用OpenFeign来封装微服务接口,有如下两种方式:

    一、RequestLine注解

    1.准备config

    @Configuration
    public class FeginConfig {
        @Bean
        public Contract feignConfiguration() {
            return new feign.Contract.Default();
        }
    }
    

    2.申明接口

    @FeignClient(name = "EMPLOYEE", configuration = FeginConfig.class)
    public interface EmployeeService1 {
        @RequestLine("POST /employee/add")
        @Headers({"Content-Type: application/json", "Accept: application/json"})
        CommonResult add(TblEmployee employee);
    
        @RequestLine("POST /employee/addBatch")
        @Headers({"Content-Type: application/json", "Accept: application/json"})
        CommonResult addBatch(List<TblEmployee> employee);
    }
    

    二、RequestMapping/PostMapping/GetMapping注解

    此种方式比较简单,直接定义接口

    @FeignClient("EMPLOYEE")
    public interface EmployeeService {
        //@PostMapping(value = "/employee/add")
        @RequestMapping(value="/employee/add",consumes = "application/json",method = RequestMethod.POST)
        CommonResult add(TblEmployee employee);
    
        @PostMapping(value = "/employee/addBatch")
            //@RequestMapping(value="/employee/addBatch",consumes = "application/json",method = RequestMethod.POST)
        CommonResult addBatch(List<TblEmployee> employee);
    }
    
    

    三、使用

    @SpringBootApplication
    @EnableEurekaClient
    @EnableDiscoveryClient  
    
    @EnableFeignClients
    @RestController
    public class WebApp {
        public static void main(String[] args) {
            SpringApplication.run(WebApp.class, args);
        }
    
        @Autowired(required = false)
        private Contract cc;
    
        @Autowired(required = false)
        private EmployeeService employeeService;
    
        @Autowired(required = false)
        private EmployeeService1 employeeService1;
    
        @PostMapping("add")
        public CommonResult add(@RequestBody TblEmployee employee) {
            return employeeService.add(employee);
        }
    
        @PostMapping("addBatch")
        public CommonResult addBatch(@RequestBody List<TblEmployee> employees) {
            return employeeService.addBatch(employees);
        }
    
        @GetMapping("/test")
        public String test() {
            Class<? extends Contract> aClass = cc.getClass();
            return aClass == null ? "" : aClass.getName();
        }
    }
    
    

    常见问题

    1.在使用RequestMapping/PostMapping/GetMapping时,如果注入了Contract,且实例为new feign.Contract.Default()。就会出现如下异常:

    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webApp': Unsatisfied dependency expressed through field 'employeeService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.laowu.service.EmployeeService': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: Method EmployeeService#add(TblEmployee) not annotated with HTTP method type (ex. GET, POST)
    Warnings:
    - Class EmployeeService has annotations [FeignClient] that are not used by contract Default
    - Method add has an annotation RequestMapping that is not used by contract Default
    

    有两种解决办法:

    1.不注入Contract

    //@Configuration
    public class FeginConfig {
        //@Bean
        public Contract feignConfiguration() {
           return new feign.Contract.Default();
        }
    }
    

    2.注入SpringMvcContract。

    @Configuration
    public class FeginConfig {
        @Bean
        public Contract feignConfiguration() {
            return new SpringMvcContract();
        }
    }
    
  • 相关阅读:
    flex布局下,将内容限定在容器内(如内容超出以省略号显示)的实现方案
    模板引擎——jquery.tmpl.js
    CSS布局——display: flex
    js实现实时显示当前时间的方法
    PS——规定尺寸的证件照的制作
    辅助开发——ps一键切图篇
    TCP的三次握手和四次挥手
    HTTP 协议基础入门篇总结
    频率组件
    视图组件
  • 原文地址:https://www.cnblogs.com/wugang/p/14477803.html
Copyright © 2020-2023  润新知