概述

这篇文章主要介绍了Feign中参数绑定和继承特性

参数绑定

其实很简单,就是和Spring MVC中的参数绑定是一样一样滴。

Spring Cloud Feign 参数绑定和继承特性

举个例子:
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;

/**
 * @author [email protected]
 * @create 2018-10-28 8:59
 **/
@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/> <!-- lookup parent from repository -->
	</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;

/**
 * @author [email protected]
 * Created by wuxiaobo on 2018/10/28.
 */
@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;

/**
 * @author [email protected]
 * @create 2018-10-28 10:13
 **/
@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;

/**
 * @author [email protected]
 * @create 2018-10-28 9:02
 **/
@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。

Spring Cloud Feign 参数绑定和继承特性

访问消费者

Spring Cloud Feign 参数绑定和继承特性

	万事大吉

相关文章:

  • 2022-02-22
  • 2021-04-30
  • 2021-09-30
  • 2021-08-22
  • 2021-11-13
  • 2021-12-09
  • 2022-12-23
  • 2021-07-25
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-11-24
  • 2022-03-03
  • 2022-12-23
  • 2021-10-13
  • 2022-12-23
相关资源
相似解决方案