2010-03-02 88 views
6

我部署到Liferay最基本的Portlet可能:部署一個簡單的portlet到Liferay - 拋出ClassCastException

public class FirstPortlet extends GenericPortlet 
{ 
    @RenderMode(name="VIEW") 
    public void welcomeWelcome(RenderRequest request, 
      RenderResponse response) throws 
      PortletException, IOException 
    {  
     PrintWriter out = response.getWriter(); 
     out.println ("This is a portlet, <em>within a Portal</em>"); 
    } 
} 

有關部署,我得到一個ClassCastException:

Caused by: java.lang.ClassCastException: FirstPortlet cannot be cast to javax.po 
rtlet.Portlet 

谷歌搜索後,看起來部署portlet.jar是一個錯誤 - 我確信我不會意外地執行此操作。

javax.portlet.Portlet由GenericPortlet實現,所有Portlet示例似乎都擴展了GenericPortlet,所以我認爲沒關係。

任何人都可以幫忙嗎?

回答

8

javax.portlet.Portlet通過了GenericPortlet實現 ,和所有的Portlet 例子似乎延長了GenericPortlet 所以我認爲這是確定。

如果GenericPortlet implements Portlet,我的猜測是你有一個類加載器的問題。這個類在兩個不同的類加載器中加載兩次,結果被認爲是不同的。

谷歌搜索後,似乎 部署portlet.jar是一個錯誤 - 我確信我不小心 這樣做。

我仍然建議你仔細檢查一下,如果你沒有portlet.jar(或另一個包含Portlet的jar)在某處加載兩次。可能的位置取決於您使用的容器(Tomcat?Glassfish?)。

+0

優秀,感謝 - 我現在得走了,但我會盡快檢查這是我能夠。我確定它確實是一個額外的portlet.jar。這絕對不在我的WAR文件中。 – 2010-03-02 20:34:08

+0

是的,它是Tomcat - 查看我對Jaromir的回覆,portlet.jar留在了tomcat/webapps目錄中。 – 2010-03-03 15:27:42

6

這絕對是類加載問題。如果你是確定你的WAR檔案中沒有portlet.jar,你可以打開詳細的類加載並觀察從哪裏加載javax.portlet.Portlet。

把你詳細的類加載傳球以下參數添加到JVM:

-verbose:類

+1

哎。是的,感謝有關冗長的信息:班級 - 這使我能夠找到答案。 我懷疑這是我自己的愚蠢! 我已經部署了一次包含portlet.jar文件的portlet。然後我意識到自己的錯誤,並將其從未來的部署中移除。 但是我還沒有意識到jar文件仍然留在tomcat/webapps目錄中。 修復:從webapps目錄中刪除相應的文件夾並重新部署。 – 2010-03-03 15:13:50

相關問題