Als Folge zu this question bin ich immer noch ein wenig verwirrt darüber, wie man die CXF-RS-Komponente richtig verwendet.Warum verwenden wir bei Verwendung der CXF-RS-Komponente <cxf: rssServer> im Gegensatz zu einer einfachen <jaxrs: server>?
Ich bin verwirrt, warum wir das <cxf:rsServer>
Tag für die Angabe CXF-RS Endpunkte benötigen (oder gibt es sogar ein solches Konzept?), Wenn ich das <jaxrs:server>
Tag tadellos verwenden kann.
Hier ist meine Konfiguration XML für beide Camel und CXF:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<jaxrs:server id="userService" address="/users">
<jaxrs:serviceBeans>
<bean class="com.example.UserServiceNoop" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />
</jaxrs:providers>
</jaxrs:server>
<bean id="user" class="org.apache.camel.component.direct.DirectComponent" />
<camel:camelContext id="someCamelContext">
<camel:route id="userServiceRoute">
<camel:from uri="cxfrs:bean:userService" />
<camel:routingSlip>
<camel:simple>user:${header.operationName}</camel:simple>
</camel:routingSlip>
</camel:route>
<camel:route id="userServiceRetrieveUser">
<from uri="user:retrieveUser" />
<!-- Assume this is going to a useful Processor -->
</camel:route>
</camel:camelContext>
</beans>
UserService.java:
package com.example;
/* a bunch of imports... */
public interface UserService {
@GET
@Path(value="/{user.id}")
@Produces({MediaType.APPLICATION_JSON})
public User retrieveUser(
@PathParam("user.id") Integer id
);
}
UserServiceNoop.java
package com.example;
/* a bunch of imports ... */
public class UserServiceNoop implements UserService
{
@Override
public User retrieveUser(Integer id) {
throw new RuntimeException();
}
}
In diesem Beispiel bin ich nicht mit einem beliebigen Tag <cxf:rsServer>
, aber es funktioniert gut. Ich weiß, dass es die CXF-RS-Komponente durchläuft, weil es beim Ausführen der Anwendung keine RuntimeExceptions auslöst, was das erwartete Verhalten bei Verwendung von CXF-RS ist (die Methodenimplementierung in der Serviceklasse wird nicht aufgerufen).
Fehle ich etwas, indem ich dieses Tag nicht verwende?
Vielen Dank!