这是使用 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/