Spring Cloud Feign客户端可以与Spring Web Controller共享接口吗?

时间:2015-03-26 17:20:26

标签: spring-cloud netflix-feign

使用Spring MVC和Feign Client(使用spring cloud)构建端点和客户端。我认为既然两端都需要有相同的注释 - 而且它们必须非常同步。也许我可以在界面中定义它们并让两端实现它。

测试它我有点惊讶它实际上适用于Spring Web结束。

但我无法找到为Feign客户端做同样事情的方法。

我基本上有接口:

@RequestMapping("/somebaseurl")
public interface ServiceInterface {
  @RequestMapping(value = "/resource/{identifier}", method = RequestMethod.POST)
  public SomeResource getResourceByIdentifier(String identifier);
}

然后是RestController

@RestController
public class ServiceController implements ServiceInterface {
    public SomeResource getResourceByIdentifier(@PathVariable("identifier") String identifier) {
    // Do some stuff that gets the resource
        return new SomeResource();
    }
}

最后是Feign客户端

@FeignClient("serviceName")
public interface ServiceClient extends ServiceInterface {
}

Feign客户端似乎没有读取继承的注释。那么还有其他方法可以完成同样的事情吗?我可以将ServiceInterface变成Feign客户端而不直接注释它吗?

1 个答案:

答案 0 :(得分:12)

Feign 8.6.0开始,这是可能的。来自Spring Cloud docs

  

Feign Inheritance Support

     

Feign通过单继承接口支持样板api。这允许对常见操作进行分组   进入方便的基础接口。与Spring MVC一起,你可以   为您的REST端点和Feign客户端共享相同的合同。

     

UserService.java

public interface UserService {

    @RequestMapping(method = RequestMethod.GET, value ="/users/{id}")
    User getUser(@PathVariable("id") long id);
}
     

UserResource.java

@RestController
public class UserResource implements UserService {

}
     

UserClient.java

@FeignClient("users")
public interface UserClient extends UserService {

}