据我了解,Camel默认使用默认的RESTLET引擎。我怎么能告诉Camel改用Jetty?
我知道有很多方法可以捆绑您的应用程序并将其部署在Tomcat或Jetty中。但是,如果我这样做,最大的问题就是如何与RESTLET集成。
我做了一些进一步的挖掘。我带了一个与骆驼一起来的tomcat示例。然后我尝试使其具备RESTLET功能。它几乎可以工作。现在的问题是参数没有传递给路线。我希望在调用这个服务器时:http://x.x.x.x:8080/rs/user/?name=Paul,我会得到:你好Paul你好吗?
然而,我只是得到:你好,你好吗?
我的骆驼配置是:
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="restlet:/user/?restletMethods=GET,POST" />
<transform>
<simple>Hello ${header.name} how are you?</simple>
</transform>
</route>
</camelContext>
<bean id="RestletComponent" class="org.restlet.Component" />
<bean id="RestletComponentService" class="org.apache.camel.component.restlet.RestletComponent">
<constructor-arg index="0">
<ref bean="RestletComponent" />
</constructor-arg>
</bean>
我的web.xml是:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:camel-config.xml</param-value>
</context-param>
<servlet>
<servlet-name>RestletServlet</servlet-name>
<servlet-class>org.restlet.ext.spring.SpringServerServlet</servlet-class>
<init-param>
<param-name>org.restlet.component</param-name>
<param-value>RestletComponent</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>RestletServlet</servlet-name>
<url-pattern>/rs/*</url-pattern>
</servlet-mapping>
我的调查越来越近了。似乎$ {in.body}确实会将请求的主体传递给路由。我仍在试图找出标题的内容。我甚至尝试使用生产者模板来调用标题,但它确实有效。那么,这在某种程度上暗示了在RESTLET中访问头的方式与在纯servlet中的不同?这是我的制作人模板:
Map<String, Object> headers = new HashMap<String, Object>();
headers.put("name","Paul");
context.createProducerTemplate().requestBodyAndHeaders(
"restlet:http://localhost:8080/camel-example-servlet-tomcat/rs/user/?restletMethod=post", "Halleluia",headers);
答案 0 :(得分:1)
查看org.apache.camel.component.restlet.DefaultRestletBinding
课程。默认情况下,表单数据仅在内容类型为“application / x-www-form-urlencoded”时绑定。此外,只有URI模板值将绑定到标头。
要获得任意查询参数,您可以执行以下操作:
Request request = exchange.getIn().getHeader(RestletConstants.RESTLET_REQUEST, Request.class);
String value = request.getResourceRef().getQueryAsForm().getFirstValue("foo");
此外,原始查询字符串将在CamelHttpQuery
标题中提供。
您可以通过使用'restletBinding'端点查询选项在Camel注册表中指定RestletBinding对象的bean ID来提供实现RestletBinding
(或扩展DefaultRestletBinding
)的自己的类。如果您使用Spring注册这样的bean:
<bean id="myRestletBinding" class="com.example.MyRestletBinding"/>
答案 1 :(得分:0)
行。看来我必须使用in.header.name而不是header.name来访问URL参数。我没有解释为什么header.name可以在普通的servlet中工作。此外,我设法只使用POST工作。使用GET,参数仍然没有传递给RESTLET引擎,或者我不知道如何检索它们。相反,使用纯servlet时GET工作正常。解决方案对我有好处,因此我将其标记为已回答。
答案 2 :(得分:0)
我建议你使用驼峰CXFRS组件。有一个声明所有REST注释的服务类。您可以将用户名作为路径参数或查询参数。
语法将是这样的:
from("cxfrs://http://localhost:9992/service?resourceClasses=com.xyz.web.resources.RESTresource")
REST资源将是您的资源类。这将通过jetty Web服务器运行REST Web服务。