2013-10-02 135 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服務。