12

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 Client

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

Feign クライアントは、継承された注釈を読み取っていないようです。同じことを達成できる他の方法はありますか?直接注釈を付けずに、ServiceInterface を Feign クライアントにすることができる場所はどこですか?

4

1 に答える 1

17

これはFeign 8.6.0 以降で可能です。Spring Cloud ドキュメントから:

偽装継承のサポート

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 {

}
于 2015-09-08T17:02:08.010 に答える