我在从动作中移除@Action
和@Result
约定插件注释并将其替换为struts.xml
中的等效配置时遇到问题。
package com.microed.cars.web;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import com.opensymphony.xwork2.ActionSupport;
public class HomeAction extends ActionSupport {
@Action(results = {
@Result(location = "/jsp/home.jsp")
})
@Override
public String execute() throws Exception {
return super.execute();
}
}
当这些注释出现时,我可以成功访问localhost:port/context/home.action
当我删除注释时,我得到'没有为动作定义结果.....'struts错误,尽管struts.xml中有一个'capture all'结果 - 整个struts.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<constant name="struts.convention.package.locators" value="web"/>
<constant name="struts.convention.default.parent.package" value="beetroot"/>
<package name="beetroot" extends="json-default">
<action name="home" class="homeAction">
<result>/jsp/home.jsp</result>
</action>
<action name="cars" class="baseCarsAction">
<result name="input" type="json">
<param name="root">autoResults</param>
/jsp/home.jsp
</result>
</action>
</package>
</struts>
它扩展了json-default,因为我需要自动完成函数的json结果类型。
我不知道为什么它没有拿起homeAction
类的动作映射。我知道struts.xml
正在被阅读,因为如果我删除动作映射“cars”,则自动完成功能被禁用(但这需要我想要删除的注释以便验证这一点。)
我知道'没有结果定义'是一个简单的错误,通常是由拼写/大写错误引起的,但这绝对不是这里的情况,它似乎只是忽略了整个“主页”动作映射。
当单步执行DefaultActionInvocation.createResult
时,根本没有'结果'来尝试匹配。
答案 0 :(得分:2)
目前cars
行动声明无效(也没有意义,IMO):
<action name="cars" class="baseCarsAction">
<result name="input" type="json">
<param name="root">autoResults</param>
<param name="location">/jsp/home.jsp</param>
</result>
</action>
那就是说:如果它是一个JSON结果,JSP就没有帮助,它会被忽略(或者彻底拒绝,我不确定它是否是错误)。单个结果将 JSON或HTML。
将记录提高到DEBUG
级别以捕获启动错误,以缩小可能原因的范围。
如果在Spring配置文件中配置了baseAction
(如果您使用Spring注释进行注入则不需要),home
操作的配置有效。
如果您实际上没有使用它,我会对部署约定插件持谨慎态度:它会更改操作的映射方式;它可能会对周围的应用程序产生影响并导致问题。坚持使用其中之一,避免两者兼而有之 - 这使得更难以推断应用程序行为的来源。
不相关,但我建议将JSP页面放在/WEB-INF
下以禁止直接客户端访问。