带有 Cxf 和路由的骆驼

Camel With Cxf and Routing

我正在研究 Camel - CXf 集成,对以下情况感到困惑。

所以我实现了一个 Rest Endpoint

@Path("/authenticate")
public interface Sample {
@GET
@Path("/handshake")
@Produces(MediaType.TEXT_PLAIN)
public Response handshake();

@POST
@Path("/login")
@Consumes({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
@Produces(MediaType.APPLICATION_JSON)
public Response login(LoginRequest request) throws JsonGenerationException, JsonMappingException, IOException;
}

实现如下

public class SampleImpl implements Sample{

@Context
private HttpHeaders headers;

@Autowired
CamelContext context;

public Response handshake()
{
    System.out.println("HandShake Executed Successfully");
    return Response.status(Status.OK).entity("This is a Message after Routing").build();
}

public Response login(LoginRequest request) throws JsonGenerationException, JsonMappingException, IOException {
    System.out.println("The Rquest objecr is Received "+request);
    return Response.status(Status.OK).entity(mapper.writeValueAsString(request)).build();
}

}

路线

<camel:from uri="cxfrs:bean:SampleRestEndPoint?bindingStyle=SimpleConsumer"></camel:from>

将其路由到实现中。但是由于实现 returns 一个响应对象我很困惑如何围绕它构建路由。

  1. 一旦调用进入实现,我该如何执行 其他路由并发回响应?在这种情况下,实现 returns 是一个自定义对象。
  2. 其他路由如何附加到 CXF 路由?
  3. 我的 CXF 实现应该总是 return void 类型吗?如我所见 也就是说,要访问 Exchange 对象 camel 需要 return 类型 无效
  4. 我是否完全忽略实施并继续 "to" 步骤 并修改它以换取所需的响应?

任何指点将不胜感激。

老兄,看看这个 - http://bushorn.com/camel-cxf-geocoder-example/

虽然上面的例子不是 REST,但是 CXF 和 Camel 路由的用法是一样的。

我将执行这些强制性步骤:

  1. 避免 beans/custom 类 - 尝试使用 camel 框架功能。

  2. 使用XML - Spring/Blueprint DSL

请看下面的帖子。

我已经使用 camel 和 Apache CXF 成功实现了 Web 服务消费。如果你有疑问,我可以帮助你。

谢谢, 高瑟姆

@GauthamHonnavara - 这是一个带有关联处理器的 JS web 服务的实现,但是它没有将任何直接路由关联到 endpoint.Also 我的问题是针对 JAX-RS 的,你不能在其中生成服务 class 来自 wsdl.

假设此用例您需要客户调用端点,然后执行另外 5 个步骤,联系另一个 Web 服务等,然后发回响应。上面的实现在 web 服务实现 bean 本身中发回一个响应。

因此,为了避免这种情况,请创建一个与生产者消费者等的简单接口,就像我的问题一样,然后如果你想注入 Exchange(如果需要的话),则使每个方法无效,并使用下面的配置

<!-- Created the CXF End Point For the  Calls to Come IN -->
<cxf:rsServer id="RestEndPoint" address="/rest"
    serviceClass="com.poc.camel.cxf.service.incoming.xxx"
    loggingFeatureEnabled="true" loggingSizeLimit="20">
    <cxf:providers>
        <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" >
            <!-- <constructor-arg ref="customObjectMapper" type="org.codehaus.jackson.map.ObjectMapper"/> -->
        </bean>
    </cxf:providers>
</cxf:rsServer>

技巧是使用服务 class 标签。如果那里提供了接口,那么它不需要 CXF 的具体实现。

希望这对您有所帮助。让我知道