2014-01-29 11 views
5

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!

Antwort

0

Sie verwenden CXF: Reserver-Tag, wenn Sie CXF-Endpunkt als Consumer von etwas verwenden möchten. Sprich zum Beispiel in einer komplexen Apache Camel Route oder in Spring Integration. wird verwendet, wenn Sie der Anbieter der Endpoint-Serving-Anforderungen sind.

Verwandte Themen