2015-10-28 71 views
3

我試圖調用屬於遠程門戶的portlet的控制器。 我試過下面的this教程,但它有很多額外的東西,這些都會導致我的構建錯誤。Liferay - 調用遠程portlet的控制器

我在遠程portlet中有一個像下面這樣的控制器。

@Controller 
public class SampleRestController { 

    @RequestMapping(value = "/helloSample", method=RequestMethod.GET) 
    @ResponseStatus(HttpStatus.OK) 
    public @ResponseBody String helloSample() { 
     return "Finally!"; 
    } 
} 

我應該怎麼做才能使用休息呼叫來調用上述方法..?也就是說,什麼是我應該做一個基本的春天的Liferay portlet可以得到http://localhost:port/.../.../helloSample輸出作爲Finally!

回答

2

您可以在一個portlet中使用一個休息控制器。鏈接的文章Using RESTFul services with Liferay很好地解釋了它。以下是總結。一個portlet

你需要做的內部

的Servlet是實現包裹在portlet應用程序的servlet。您需要在web.xml中配置Liferay的PortalDelegateServlet。該servlet將把請求處理委託給Spring的DispatcherServlet

<servlet> 
    <servlet-name>restful</servlet-name> 
    <servlet-class>com.liferay.portal.kernel.servlet.PortalDelegateServlet</servlet-class> 
    <init-param> 
     <param-name>servlet-class</param-name> 
     <param-value>org.springframework.web.servlet.DispatcherServlet</param-value> 
    </init-param> 
    <init-param> 
     <param-name>sub-context</param-name> 
     <param-value>restful</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>restful</servlet-name> 
    <url-pattern>/services/*</url-pattern> 
<servlet-mapping> 

的寧靜servlet需要將包含AnnotationMethodHandlerAdapter,視圖解析器和JSON映射器其單獨的應用程序的上下文。

鑑於其餘控制器從你的例子

@Controller 
public class SampleRestController { 

    @RequestMapping(value = "/helloSample", method=RequestMethod.GET) 
    @ResponseStatus(HttpStatus.OK) 
    public @ResponseBody String helloSample() { 
     return "Finally!"; 
    } 
} 

所得網址爲從動地由

http://host:port/<<context path>>/services/helloSample 
       |    |  | 
       | Context path of your application (eg. test-1.0-SNAPSHOT) 
            |  | 
            | Defined by servlet mapping in web.xml 
              | 
              | Defined by @RequestMapping in the controller 

示例網址Tomcat的部署:http://localhost:8080/test-1.0-SNAPSHOT/services/helloSample

詳情請參閱the linked article

Liferay JIRA問題Custom servlets running in the ROOT context中總結了此功能的最初想法。

+0

我試圖實現這一點。但我仍然不成功。我看到消息'[RequestMappingHandlerMapping:181]映射「{[/ helloSample],methods = [GET],params = [],headers = [],consumes = [],produce = [],custom = []}」到public java.lang.String com.liferay.test.servlet.SampleRestController.helloSample()'。但是,當我嘗試訪問使用上面提供的網址時,它說'Not Found' –

+0

您可以請驗證https://github.com/philipjohn007/Test-Portlet並讓我知道我在代碼中做了什麼錯誤..?我沒有在'test-servlet'中爲'jacksonObjectMapper'添加部分,因爲我沒有發現該映射器沒有找到類。這是造成這個問題..? –

+0

這個例子非常好,幾乎可以工作。您需要將'@ ResponseBody'註釋添加到您的控制器方法中。否則,結果將被解釋爲JSP視圖名稱。我更正了url描述 - 它不包含portlet名稱(正如我最初寫的那樣),但當然是應用程序的上下文路徑(在我的情況下是Tomcat - http:// localhost:8080/test-1.0-SNAPSHOT/services/helloSample)。這就是我需要使測試應用程序正常工作的一切。您可以在'helloSample'方法中返回'PortalUtil.getPortal()'來驗證JSON映射器的工作原理。 –

0

因爲你的控制器不屬於一個portlet的變化,你可以簡單地調用

http://localhost:port/_context path of your war_/helloSample 

作爲鏈接教程說:

所以在我的樣本項目,我會產生將通過定製portlet消耗RESTful服務...

他沒有創建一個包含控制器的portlet - 也不是。