2015-03-26 11 views
5

Erstellen eines Endpunkts und Clients mit Spring MVC und Feign Client (mit Spring Cloud). Ich hatte den Gedanken, dass da beide Enden dieselben Annotationen haben müssen - und dass sie ziemlich synchron sein müssen. Vielleicht könnte ich sie in einer Schnittstelle definieren und die beiden Enden implementieren lassen.Kann eine Spring Cloud Feign-Clientschnittstelle mit einem Spring Web Controller gemeinsam genutzt werden?

Testen Sie es Ich war etwas überrascht, dass es tatsächlich für die Spring Web End funktioniert.

Aber ich kann keinen Weg finden, das gleiche für einen Feign-Client zu tun.

Ich habe im Grunde die Schnittstelle:

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

Und dann die RestController

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

Und dann schließlich die Feign Kunde

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

Der Kunde Feign scheint nicht geerbt zu lesen Anmerkungen. Gibt es eine andere Möglichkeit, das gleiche zu erreichen? Wo kann ich das ServiceInterface zum Feign-Client machen, ohne es direkt zu kommentieren?

+0

würde ich nicht überrascht, wenn Sie die ersten sind, dies zu tun . Sie müssten den Feign-Client von Hand aufbauen. – spencergibb

+0

Ah gut. Ich denke, das könnte stimmen. Wäre praktisch, wenn es funktionieren könnte. – Kristoffer

+0

Warum müssen Sie die 'getResourceByIdentifier()' Methode neu deklarieren? Ist es nicht dasselbe wie die Elternschnittstelle? –

Antwort

7

Dies ist ab Feign 8.6.0 möglich. Vom Spring Cloud docs:

Feign Inheritance Unterstützung

Feign unterstützt vorformulierten apis über Single-Vererbung Schnittstellen. Dies ermöglicht die Gruppierung gemeinsamer Operationen in bequeme Basisschnittstellen. Zusammen mit Spring MVC können Sie den gleichen Vertrag für Ihren REST-Endpunkt und Ihren Feign-Client teilen.

UserService.java

public interface UserService { 

    @RequestMapping(method = RequestMethod.GET, value ="https://stackoverflow.com/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 { 

} 
Verwandte Themen