2017-11-28 5 views
0

Ich habe einen SpringBoot Server, der mehrere Dienste unter mehreren REST-Controllern bietet. So habe ich so etwas wie:Client für mehrere Dienste vorgeben

  • /serviceA/API1
  • /serviceA/api2
  • /serviceB/API1
  • /serviceB/api2

I verwenden möchten Client vorgeben, um auf sie zuzugreifen. Aber ich stelle nicht alle diese Anrufe in eine "flache" Schnittstelle. So mag ich nicht haben:

public interface Client { 
    @RequestLine(value="GET /serviceA/api1") 
    public String getServiceAapi1(); 

    @RequestLine(value="GET /serviceA/api2") 
    public String getServiceBapi2(); 

    @RequestLine(value="GET /serviceB/api1") 
    public String getServiceAapi1(); 

    @RequestLine(value="GET /serviceB/api2") 
    public String getServiceBapi2(); 
} 

ich für eine Art und Weise bin auf der Suche, so dass während der Laufzeit kann ich verwenden:

client.serviceA().api1(); 
client.serviceA().api2(); 
client.serviceB().api1(); 
client.serviceB().api2(); 

Jede Art und Weise, dies zu tun?

Ich hoffe diese Anfrage macht Sinn ;-).

Danke.

Henry

Antwort

0

können Sie die param-Option verwenden und mit Java 8, die Schnittstellen aktiviert sind die Standardmethode verwenden, so dass Sie so etwas wie nächste implementieren könnte:

@RequestLine(value="GET /serviceA/{api}") 
public String getServiceApi(@Param("api") String api); 

default String api1() { 
    return getServiceApi("api1"); 
} 

default String api2() { 
    return getServiceApi("api2"); 
} 

Die Struktur Wenn Sie nicht zur Laufzeit vom Feign-Client angelegt werden möchten, müssen Sie eine Struktur wie die folgende selbst erstellen:

public class Client { 

    private final ServiceA serviceA; 
    private final ServiceB serviceB; 

    public Client(ServiceA serviceA, ServiceB serviceB) { 
     this.serviceA = serviceA; 
     this.serviceB = serviceB; 
    } 

    public ServiceA serviceA() { 
     return serviceA; 
    } 

    public ServiceB serviceB() { 
     return serviceB; 
    } 

    interface ServiceA { 
     @RequestLine(value="GET /serviceA/api1") 
     public String api1(); 

     @RequestLine(value="GET /serviceA/api2") 
     public String api2(); 
    } 

    interface ServiceB { 
     @RequestLine(value="GET /serviceB/api1") 
     public String api1(); 

     @RequestLine(value="GET /serviceB/api2") 
     public String api2(); 
    } 
}