如何使用Apache Camel,CXF和Spring Boot实现Web服务版本网关

时间:2016-01-27 16:57:39

标签: web-services spring-boot apache-camel cxf

我目前正在开发一个项目,我使用Apache Camel,CXF进行WebService实现。最重要的是我使用Spring Boot(嵌入了tomcat)。

我为每个Web服务版本开发了不同的CXF端点,可以通过以下方式访问它们 http://myserver.com/service/V1http://myserver.com/service/V2。除非我要求在一个URL http://myserver.com/service/CommonVersion下运行这些服务并将其路由到基于xpath的特定版本,否则这一切都正常。

我真的不知道如何配置然后从公共入口点向特定于版本的入口点发送Web服务请求。

我想为我的应用程序提供一些设置: CXF-context.xml中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring" xmlns:cxf="http://camel.apache.org/schema/cxf" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring  http://camel.apache.org/schema/spring/camel-spring.xsd  http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd">

  <cxf:cxfEndpoint id="serviceV1"
                 address="/service/V1" serviceName="s:Service" serviceClass="com.myservice.v1.service" xmlns:s="http://com.myservice/ServiceV1">
   <cxf:properties>
      <entry key="allowStreaming" value="false" />
   </cxf:properties>
  </cxf:cxfEndpoint>

  <cxf:cxfEndpoint id="serviceV2" address="/service/V2" serviceName="s:Service" serviceClass="com.myservice.v2.service" xmlns:s="http://com.myservice/ServiceV2">
   <cxf:properties>
      <entry key="allowStreaming" value="false" />
   </cxf:properties>
  </cxf:cxfEndpoint>
</beans>

和为我的cxf端点定义的样本路由

@Component
public class ServiceV1 extends SpringRouteBuilder {
  public void configure() throws Exception {
    from("cxf:bean:serviceV1").to("mock:processFurther")
  }

}

我的应用程序配置如下:

@SpringBootApplication
@ImportResource({ "/cxf-context.xml" })
public class Application extends SpringBootServletInitializer {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Override
  protected SpringApplicationBuilder configure(
        SpringApplicationBuilder application) {
    return super.configure(application).sources(Application.class);
  }

  @Bean
  public ServletRegistrationBean servletRegistrationBean() {
    CXFServlet servlet = new CXFServlet();
    return new ServletRegistrationBean(servlet, "/*");
  }
}

1 个答案:

答案 0 :(得分:0)

您肯定知道,对于CXF和Camel,服务的实现是由路由本身完成的。

我会重命名你所说的&#34; ServiceV1&#34; (&#34;扩展SpringRouteBuilder&#34;)就像&#34; Routes&#34; (因为所有的路线都在那里而不只是一个服务),并且这样实现 - 只是一个让事情变得现实的例子:

AND

这里我不打开xpath但是在标题值上 - 你明白了。这是否想要你在寻找?