java - 如何使用 Apache Camel 实现直通 JAX-RS 代理?

标签 java web-services esb apache-camel

这是使用 Camel 2.5.0

路线很简单。起点是 jetty://.../web/service/path 路线的终点是 http://real-webservice-host/web/service/path .我遇到的问题是,在调用远程 Web 服务时,它没有被正确调用。

具体来说,当我在 http 组件上使用 bridgeEndpoint=true 选项时,不会设置 Content-Type header 。这导致我的远程 JAX-RS 服务报告错误 415 Unsupported Media Type。如果我没有在 http 组件上设置 bridgeEndpoint 选项,那么我必须去设置主机 header 以指向我已经在 http 端点 URI 中声明的主机。

我希望能够做的是:

from("jetty://host/path?matchOnUriPrefix=true").to("http://jaxrs-host/path")

并将 HTTP 方法、 header 和正文代理到远程端点。

我有一个解决方法,使用代理请求的 CXFRS bean:

@Path("/api/address")
class AddressServiceProxy {

  @BeanProperty
  var targetUrl : String = _

  @POST
  @Consumes(Array("application/xml"))
  @Produces(Array("application/xml"))
  @Path("/validation")
  def validate(in: InputStream) = {
    WebClient.create(targetUrl).post(in, classOf[String])
  }

}

在 spring 配置中:

<bean id="addressServiceProxy" class="beans.AddressServiceProxy">
    <property name="targetUrl" 
              value="http://localhost:9000/api/address/validation"/>
</bean>

在 route :

from("jetty://http://0.0.0.0:8080/api/address?matchOnUriPrefix=true")
.to("cxfbean:addressServiceProxy")

这种方法有效,但需要我复制我正在代理的 JAX-RS 端点。这是解决问题的最佳方法,还是有更好的方法?

最佳答案

这是 camel-http 的一个错误,我刚刚创建了一个 JIRA并将为其提交快速修复。

关于java - 如何使用 Apache Camel 实现直通 JAX-RS 代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4810050/

相关文章:

esb - Mule 功能测试 - 完全糊涂

java - 无法更改 BorderLayout 中 block 的大小

java - 匹配字符之间的文本(避免嵌套)

java - 当 namespace 定义在操作标记内时,如何处理 Castor 对 SOAP 消息的解码?

javascript - Web 服务器代码无法正常工作

rabbitmq - 使用路由 key 来通信服务

mule - Mule 流中出现错误 - 消息有效负载的类型为 : byte[]

java - 为什么在 Android Studio 中使用 Firebase 数据库时 onClick 内的 "If Condition"不起作用?

java - 可滚动复选框

java - 由于先前的错误而跳过安装应用程序监听器 - Tomcat