java - Liferay + Struts2 没有为命名空间/testPortlet1 和操作名称 startTestPortlet1 映射的操作,为什么?

标签 java jakarta-ee struts2 content-management-system liferay

我在 Liferay portlet 开发方面绝对是新手,并且遇到以下问题。

当我尝试在 portlet 中添加我的第一个 portlet(由我开发)时,我收到以下错误消息:

testPortlet1 is temporarily unavailable.

在我的 IDE 的堆栈跟踪中,我看到以下错误消息:

2014-12-19 11:37:55,874 [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'] ERROR commons.CommonsLogger.error(38) - Could not find action
There is no Action mapped for namespace /testPortlet1 and action name startTestPortlet1. - [unknown location]
    at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:189)
    at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
    at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
..............................................................................
..............................................................................
..............................................................................
11:37:55,883 ERROR [PortletServlet:96] javax.portlet.PortletException: Could not find action startTestPortlet1
javax.portlet.PortletException: Could not find action startTestPortlet1
    at org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher.serviceAction(Jsr168Dispatcher.java:454)
    at org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher.render(Jsr168Dispatcher.java:322)
    at com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:101)
..............................................................................
..............................................................................
..............................................................................
Caused by: There is no Action mapped for namespace /testPortlet1 and action name startTestPortlet1. - [unknown location]
    at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:189)
..............................................................................
..............................................................................
..............................................................................
11:37:55,892 ERROR [jsp:154] There is no Action mapped for namespace /testPortlet1 and action name startTestPortlet1. - [unknown location]
    at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:189)
    at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
..............................................................................
..............................................................................
..............................................................................

这是与我的 portlet 相关的 structs.xml 部分:

<package name="TestPortlet1Package" extends="struts-portlet-default" namespace="/">
    <action name="startTestPortlet1" class="TestPortlet1Action" method="startTestPortlet1">
        <result name="success">/testPortlet1/testPortlet1.jsp</result>
    </action>
</package>

这是我的 JSP View (在 \Web\src\main\webapp\testPortlet1\testPortlet1.jsp 中定义):

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="sj" uri="/struts-jquery-tags" %>
<style>
    .portlet-topper#portlet_SliderNewsPortlet_WAR_KMPortlets, .portlet-title#portlet_SliderNewsPortlet_WAR_KMPortlets {
        display: none
    }

    .portlet#portlet_SliderNewsPortlet_WAR_KMPortlets, .portlet-content#portlet_SliderNewsPortlet_WAR_KMPortlets {
        border: 0;
        margin: 0;
        padding: 0;
        background: 0;

    }
</style>
<hr style="height:1px;border:none;color:#1d8843;background-color:#1d8843;width: 98%" size="4px">
<table width="100%">
    <tr>
        <td>
            <table class="homePortletTitle">
                <tr>
                    <td style="padding-bottom: 0px;"><img src="/km-theme/images/km-icons/section_icon_focus.png"></td>
                    <th style="">TestPortlet1</th>
                    <td style="">Hello World Portlet</td>
                </tr>
            </table>
        </td>
    </tr>

    <tr>
        <td>
          <p>Hello World !!!</p>
        </td>
    </tr>
</table>

这是我在 portlet.xml 文件中定义的 portlet 配置:

<portlet>

    <portlet-name>testPortlet1</portlet-name>
    <display-name>testPortlet1</display-name>
    <portlet-class>org.apache.struts2.portlet.dispatcher.Jsr168Dispatcher</portlet-class>

    <init-param>
        <name>viewNamespace</name>
        <value>/testPortlet1</value>
    </init-param>

    <init-param>
        <name>defaultViewAction</name>
        <value>startTestPortlet1</value>
    </init-param>

    <expiration-cache>0</expiration-cache>

    <supports>
        <mime-type>text/html</mime-type>
        <portlet-mode>VIEW</portlet-mode>
    </supports>

    <portlet-info>
        <title>testPortlet1</title>
    </portlet-info>

</portlet>

我错过了什么?我该如何解决这个问题?我要疯了。

Tnx

最佳答案

struts.xml 中定义的包命名空间与 porlet.xml 中的 viewNamespace 之间不匹配。解决方案:修复struts.xml

<package name="TestPortlet1Package" 
         extends="struts-portlet-default" 
         namespace="/testPortlet1">

关于java - Liferay + Struts2 没有为命名空间/testPortlet1 和操作名称 startTestPortlet1 映射的操作,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27564551/

相关文章:

java - Collections.synchonizedMap 和同步

java - 将大量排队数据写入文件时出现内存错误

css - Struts2 中的分页未捕获标题行的 css

java - 为网络保留的位

java - 当用户输入文本时 Swing GUI 移动

java - Hibernate中Environment.DEFAULT_SCHEMA和数据库的区别

jakarta-ee - 声明对具有多个角色(包括)的用户的安全约束

java - 如何停止 Wildfly11 加载 jar 依赖 Web 服务

javascript - 如何从 s :hidden tag in Struts 2 获取 jQuery 中的对象列表

java - 为什么 struts2 FilterDispatcher 被弃用?