2015-04-21 12 views
10

ho bisogno di esporre qualche servizio per l'utilizzo a distanza dai client Java (che utilizzano httpinvoker) e di altre lingue (si devono utilizzare REST).E 'possibile esporre remoto un fagiolo in avvio di primavera utilizzando REST e httpInvoker

Posso configurare avvio primavera per esporre entrambe le cose? (Non mi dispiacerebbe se venissero usate due istanze separate con porte diverse, come in this post).

I dumping l'idea di fornire un'API per i client Java che internamente utilizza RIPOSO perché è piuttosto noioso cablare tutti gli endpoint REST nel codice utilizzando manualmente RestTemplate. Mi piace il concetto di HttpInvoker perché un ProxyFactoryBean si abitua automagicamente. Se Spring Remoting fosse in grado di fare ciò in un modo che può essere fatto per JMS, AMQP e gli altri, vorrei andare in questo modo.

+0

Stai mescolando probabilmente due idiomi: RPC e il trasferimento dello stato. httpInvoker riguarda le chiamate a procedure remote. Si chiama semplicemente un metodo, si passano alcuni argomenti e si ottiene una sorta di risultato. In REST hai a che fare praticamente cambiando uno stato particolare di qualcosa (è fondamentalmente l'idea REST). Immagino che la soluzione migliore per un caso del genere sia avere due facciate diverse davanti al tuo servizio che seguono i principi di ogni stile API. – mp911de

+0

Penso che entrambe le tecniche permettano di cambiare lo stato. In REST si tratta di un http GET, con httpInvoker si chiama getMethod.Per modificare/creare valori REST utilizza PUT/POST e le chiamate httpInvoker impostate/create. Ma quando parli delle due facciate questo è il posto dove è interessante: come può essere fatto in modo elegante? – Marged

+0

@Marged perché vorresti usare uno strumento deprecato come Spring HttpInvoker? Era già deprecato in Spring 2.0, non credo che Spring Boot lo autoconfigurasse o addirittura gestisse la dipendenza. –

risposta

2

È possibile utilizzare qualcosa di simile. Esporre i tuoi servizi come servizio di riposo. Quindi fai in modo che i tuoi client Java consumino quei servizi usando http o qualche altra libreria. Se anche un'altra parte è interessata, può anche consumarla a modo suo.

Altrimenti è possibile creare il proprio vasetto di consumare i propri servizi di riposo e lasciare che i vostri clienti utilizzano Java che, senza la conoscenza del servizio di riposo.

+0

La creazione di un jar che chiama l'interfaccia REST è l'approccio che ho scaricato. Cerco un approccio facile dove la maggior parte viene creata automaticamente. Questo funziona per httpinvoker e REST quando utilizzo ciascuna tecnica in modo isolato. – Marged

0

HttpInvoker è stata abbandonata dopo 2.x primavera-integrazione: http://docs.spring.io/spring-integration/docs/2.0.x/reference/html/httpinvoker.html (! Intestazione importante fornisce i dettagli). C'è un riferimento a supporto HTTP nelle versioni 3.xe 4.x: http://docs.spring.io/spring-integration/docs/latest-ga/reference/html/http.html

C'è anche un altro post in modo con qualcuno chiedendo il supporto HTTP e avvio di primavera con alcune informazioni utili: Spring Integration Http with Spring Boot and @RequestMapping

Speriamo che questo ottiene fai parte dell'uscita dalla tana del coniglio.

+1

Forse sto interpretando erroneamente questo, ma solo perché Spring _Integration_ lascia il supporto per HttpInvoker, ma non lo stesso Sprint che lo ha abbandonato o deprecato. Perché non sto usando Spring Integration non dovrei incorrere in problemi. – Marged

+0

Sì ... sei corretto. http://docs.spring.io/spring/docs/current/spring-framework-reference/html/remoting.html –

1

Utilizziamo entrambe le tecniche qui. HttpInvoker per invocazioni Java-to-Java. JSON semplice su HTTP per altri client (simile a REST ma non vero REST). Penso che il progetto jsonrpc4j sia un buon modo per implementare le cose HTTP.

3

Esporre endpoint Invoker HTTP in primavera Boot è in realtà così facile che sembra come se mancasse qualcosa. In un @SpringBootApplication che ha spring-webmvc sul suo percorso (ad esempio con il spring-boot-starter-web POM), aggiungere la seguente definizione bean:

@Bean(name = "/my.service") 
public HttpInvokerServiceExporter myHttpInvokerServiceExporter(MyService myServiceImpl) { 
    HttpInvokerServiceExporter exporter = new HttpInvokerServiceExporter(); 
    exporter.setServiceInterface(MyService.class); 
    exporter.setService(myServiceImpl); 
    return exporter; 
} 

HTTP invoker endpoint è ora esposta a /my.service e non influenzerà le altre mappature. Puoi aggiungere tanti endpoint come vuoi; e poi alcuni @RequestMapping s per REST in cima.

Problemi correlati