Mehrere resouceBean Konfiguration in CXF mit Spring
Ich bin mit CXF RS 2.5.1 mit Feder 3.0.6-VERSION. Ich würde gern mehrere Implementierungsklassen für "einen einzelnen Endpunkt". Ich sehe, dass dieses Problem wurde gemeldet und behoben https://issues.apache.org/jira/browse/CXF-2439, aber wenn ich versuche, es zu tun, CXF nur zur Auswahl der ersten Ressource-Klasse aus jaxrs:serviceBeans tag. Für die andere Anfrage habe ich diese Meldung sehen, die auf tomcat-Konsole als "Keine operation, die passende Pfad der Anforderung /Konto/Pause/transfer ist gefunden". Unten ist die Konfiguration. Schätzen jede Eingabe.
web.xml
<listener>
<listener-class> org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:account-servlet.xml</param-value>
</context-param>
<servlet>
<servlet-name>CXF Servlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXF Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
account-servlet.xml
<jaxrs:server id="accountService" address="/rest">
<jaxrs:serviceBeans>
<ref bean="transferService" />
<ref bean="balanceService"/>
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
</jaxrs:server>
<bean id="transferService" class="com.mycompany.service.TransferService"/>
<bean id="balanceService" class="com.mycompany.service.BalanceService"/>
BalanceService.java (Importe entfallen)
package com.mycompany.service;
@Path("/")
@Produces("application/xml")
public class BalanceService{
@GET
@Path("/balance")
public String getBalance() {
StringBuilder response = new StringBuilder(128);
response.append("<Balance>")
.append("<amount>").append("250.00").append("</amount>")
.append("</Balance>");
return response.toString();
}
}
TransferService.java (Importe entfallen)
package com.mycompany.service;
@Path("/")
@Produces("application/xml")
public class TransferService {
@GET
@Path("/transfer")
public String getTransfer() {
StringBuilder response = new StringBuilder(128);
response.append("<Transfer>")
.append("<amount>").append("350.00").append("</amount>")
.append("</Transfer>");
return response.toString();
}
}
Bitte ignorieren Sie jegliche Programmierung Unregelmäßigkeiten/Normen, wie es nur eine Beispiel-app für den POC.
- warum nicht verschieben /balance und /übertragung auf Klassen-Ebene ??
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich löste dieses problem, indem ein Teil der @Path-mapping auf der service-bean-Klasse. In deinem Fall:
BalanceService
Flughafenuebertragungen
Also verbringe ich einige Zeit mit der Suche im internet, fand aber keine Lösung für dieses problem. Es ist ein Hinweis in der SCHRIFTLICHEN Dokumentation, die verwendet werden können, um daraus die Lösung.
http://cxf.apache.org/docs/jax-rs-basics.html#JAX-RSBasics-Customselectionbetweenmultipleresources
Daher schrieb ich eine benutzerdefinierte Ressource-Komparator, haben die entsprechenden jaxrs:server-Konfiguration und-Eureka! es funktionierte!. Nun, ich habe 2 Implementierung Klassen zugeordnet, um eine einzelne Ressource/Adresse in javax:rs-Adresse.
Bitte beachten Sie, dass Logik in benutzerdefinierten Ressource Komparator unten gezeigt variieren, basierend auf der URL-Muster.
Angabe Quelle aller Dateien. Hoffe, dies hilft jemand in der Zukunft 🙂
web.xml
account-servlet.xml (Datei ApplicationContext)
pom.xml
Benutzerdefinierte Ressource-Komparator
Umsetzung-Klassen/beans
AccountService.java
TransferService.java
URLs:
Kann man wohl Vereinfachung der Logik zu tun, einen Vergleich der root-Ressourcen, beispielsweise wissen, der Anfrage-URI und den Namen des root-Ressource-Klasse kann ausreichend sein, um die Entscheidung zu treffen, die überprüfung der einzelnen Methoden zu kompliziert erscheint. BTW, die benutzerdefinierte Ressourcen-Komparatoren sind nur dann erforderlich, wenn entweder root-Ressourcen-und/oder einzelne Ressource-Methoden kann die gleichen Kandidaten
Ich würde lösen das problem auf diese Weise:
Entfernen "Benutzerdefinierte Ressource-Komparator" (es gibt keine Notwendigkeit zu)
Entfernen diese:
In der account-servlet.xml/Datei ApplicationContext:
In der Bohnen/Klasse Umsetzung:
Und das ist alles. 🙂