2013-10-02 94 views
0

据我所知,骆驼默认使用默认的RESTLET引擎。我怎样才能告诉骆驼使用Jetty呢?RESTLET骆驼与码头

我知道有办法打包你的应用程序并将其部署在Tomcat或Jetty中。但是,如果我这样做,最大的问题就是如何与RESTLET集成。

我做了一些进一步的挖掘。我带上了骆驼的一个tomcat例子。然后我试图让它具有RESTLET能力。它几乎可以工作。现在的问题是参数没有传递给路由。我希望在调用这个服务器时:http://x.x.x.x:8080/rs/user/?name=Paul,我会得到:Hello 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); 

回答

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 Registry中指定RestletBinding对象的bean ID来提供自己的类,该类实现RestletBinding(或扩展DefaultRestletBinding)。如果你使用Spring注册一个这样的bean:

<bean id="myRestletBinding" class="com.example.MyRestletBinding"/> 
+0

对不起。你的意思是只有URI模板值才会被绑定到头文件中? – Klaus

+0

查看[Camel Restlet文档](http://camel.apache.org/restlet.html#Restlet-SinglerestletendpointtoservicemultiplemethodsandURItemplates)。有一个使用URI模板的例子,例如'/ users/{username}',而不是查询参数。 URI模板将被绑定到相同名称的标题。 –

0

好的。看来我必须使用in.header.name而不是header.name来访问URL参数。我没有解释为什么header.name可以在普通的servlet中工作。此外,我设法让这个工作只与POST。使用GET,参数仍然不会传递给RESTLET引擎,或者我不知道如何检索它们。相反,使用纯servlet时,GET工作正常。解决方案对我有好处,因此我将其标记为已回答。

0

我建议你使用骆驼CXFRS组件。拥有一个声明所有REST注释的服务类。您可以将用户名作为路径参数或查询参数。

语法将是这样的:

from("cxfrs://http://localhost:9992/service?resourceClasses=com.xyz.web.resources.RESTresource") 

REST资源将是你的资源类。这将通过码头Web服务器运行REST Web服务。