概述
这篇文章主要介绍了Feign中参数绑定和继承特性
参数绑定
其实很简单,就是和Spring MVC中的参数绑定是一样一样滴。

举个例子:
package com.bobo.service;
import com.bobo.bean.User;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "eureka-client")
public interface HelloService {
@RequestMapping(value = "hello")
String Hello();
@RequestMapping(value = "/hello1",method = RequestMethod.GET)
public String Hello (@RequestParam(value = "name") String name);
@RequestMapping(value = "/hello2",method = RequestMethod.GET)
public User Hello (@RequestHeader(value = "name") String name, @RequestHeader(value = "age") String age);
@RequestMapping(value = "/hello3",method = RequestMethod.POST)
public String Hello (@RequestBody User user);
}
这里主要的是,在Spring MVC中value是可以省略的,但是在Feign中有的时候省略会报错,所以大家使用的时候还是都
加上比较好。
继承特性
在写代码的时候我们发现,其实很多代码都是重复的,所以为了简化代码的书写。所以可以使用继承的方法来减少
代码量。
如何实现
抽象接口
第一步就是把接口全部都抽象出来。为此应该建立一个新的项目。这个项目名字是hello-service-api。
引入pom
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.17.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.bobo</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
定义接口
package com.bobo.service.api;
import com.bobo.bean.User;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@RequestMapping(value = "/refactor")
public interface HelloService {
@RequestMapping(value = "/hello4",method = RequestMethod.GET)
public String Hello (@RequestParam(value = "name") String name);
@RequestMapping(value = "/hello5",method = RequestMethod.GET)
public User Hello (@RequestHeader(value = "name") String name, @RequestHeader(value = "age") String age);
@RequestMapping(value = "/hello6",method = RequestMethod.POST)
public String Hello (@RequestBody User user);
}
在eureka client实现
引入hello-service-api
<dependency>
<groupId>com.bobo</groupId>
<artifactId>hello-service-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
实现接口
package com.bobo.eurekaserver.controller;
import com.bobo.bean.User;
import com.bobo.service.api.HelloService;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RefactorHelloController implements HelloService{
@Override
public String Hello(String name) {
return "Hello" +name;
}
@Override
public User Hello(String name, String age) {
return new User(name,Integer.parseInt(age));
}
@Override
public String Hello(User user) {
return "Hello" + user.getName() +", "+user.getAge();
}
}
改造feign-consumer
引入hello-service-api
<dependency>
<groupId>com.bobo</groupId>
<artifactId>hello-service-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
继承借口
package com.bobo.service;
import org.springframework.cloud.netflix.feign.FeignClient;
/**
* @author [email protected]
* @create 2018-10-28 10:17
**/
@FeignClient(value = "eureka-client")
public interface RefactorHelloService extends com.bobo.service.api.HelloService {
}
在controller调用
package com.bobo.controller;
import com.bobo.bean.User;
import com.bobo.service.HelloService;
import com.bobo.service.RefactorHelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private HelloService helloService;
@Autowired
private RefactorHelloService refactorHelloService;
@GetMapping(value = "/hello")
public String Hello() {
return helloService.Hello();
}
@RequestMapping(value = "/hello1",method = RequestMethod.GET)
public String Hello (@RequestParam String name){
return helloService.Hello(name);
}
@RequestMapping(value = "/hello2",method = RequestMethod.GET)
public User Hello (@RequestHeader String name, @RequestHeader String age) {
return helloService.Hello(name,age);
}
@RequestMapping(value = "/hello3",method = RequestMethod.POST)
public String Hello (@RequestBody User user) {
return helloService.Hello(user);
}
@RequestMapping(value = "/hello4",method = RequestMethod.GET)
public String Hello1 (@RequestParam String name){
return refactorHelloService.Hello(name);
}
}
结果
依次打开 eureka,eureka server和feign -consumer这三个项目,使用浏览器打开eureka。

访问消费者

万事大吉