Struts2 删除convention.annotation-替换为struts.xml中的config

Struts2 删除convention.annotation-替换为struts.xml中的config,struts2,struts2-convention-plugin,Struts2,Struts2 Convention Plugin,从操作中删除@Action和@Result约定插件注释并用struts.xml中的等效配置替换它们时出现问题 package com.microed.cars.web; 导入org.apache.struts2.convention.annotation.Action; 导入org.apache.struts2.convention.annotation.Result; 导入com.opensymphony.xwork2.ActionSupport; 公共类HomeAction扩展了Action

从操作中删除
@Action
@Result
约定插件注释并用
struts.xml
中的等效配置替换它们时出现问题

package com.microed.cars.web;
导入org.apache.struts2.convention.annotation.Action;
导入org.apache.struts2.convention.annotation.Result;
导入com.opensymphony.xwork2.ActionSupport;
公共类HomeAction扩展了ActionSupport{
@行动(结果={
@结果(location=“/jsp/home.jsp”)
})
@凌驾
公共字符串execute()引发异常{
返回super.execute();
}
}
当这些注释存在时,我可以成功访问
localhost:port/context/home.action

当我删除注释时,我得到“没有为操作定义结果…”struts错误,尽管struts.xml中存在“捕获全部”结果-整个struts.xml如下所示:


/jsp/home.jsp
自动结果
/jsp/home.jsp
它扩展了json默认值,因为我需要自动完成函数的json结果类型

我不知道为什么它没有为
homeAction
类拾取动作映射。我知道正在读取
struts.xml
,因为如果我删除动作映射“cars”,那么自动完成将被禁用(但这需要我尝试删除的注释来验证这一点)

我知道“未定义结果”是一个简单的错误,通常由拼写/大小写错误引起,但这里的情况绝对不是这样,它似乎只是忽略了整个“主”动作映射


当单步执行
DefaultActionInvocation.createResult
时,根本没有任何“结果”可供其尝试匹配。

就目前而言,
cars
操作声明无效(在我看来也没有意义):


自动结果
/jsp/home.jsp
也就是说:如果这是一个JSON结果,JSP是没有帮助的,它将被忽略(或者完全被拒绝,我不确定这是否是一个错误)。单个结果将是JSON或HTML

将日志记录提高到
DEBUG
级别以捕获启动错误,从而缩小可能原因的范围

如果在Spring配置文件中配置了
baseAction
(如果使用Spring注释进行注入,则不需要配置),则
home
操作的配置有效

如果您没有实际使用约定插件,我会小心部署它:它会改变动作的映射方式;它可能会影响周围的应用程序并导致问题。坚持其中一个,避免两者兼而有之——这会使人们更难对应用程序行为的来源进行推理


不相关,但我建议将JSP页面置于
/WEB-INF
下,以禁止直接客户端访问。

是,我从struts.xml中删除了约定常量,现在可以按预期工作——也许更重要的是——以我理解的方式工作——我对注释的经验仅限于用于依赖注入的基本Spring注释。戴夫,你的知识令人印象深刻,像你这样耐心地帮助别人是非常高尚的。谢谢大家!@肯纳顿·阿舒克;没问题。一开始你需要绞尽脑汁,但是一旦你知道了寻找问题的地方,事情就会很快发生:)+1虽然我强烈支持struts2 conventions插件,但是xml映射可能会发生奇怪的事情,配置浏览器插件会变得混乱,并且会说出正确的谎言。从插件来看,获取操作状态并不是那么容易。动作处理并不是一个特别统一的东西,我真的希望它更加统一,因为如果你能准确(并且容易)确定某些处理,一些有趣的事情是可能的。。。在运行时修改struts2处理有点困难。很抱歉,但确实指出了为什么它不合作。@Quaternion我同意;添加约定包可能会导致违反直觉的行为。我不确定让浏览器插件协作的最佳方式是什么,尽管现在有了插件排序机制(IIRC)可能会更容易。我可能会把它作为一个相关项目的一部分来讨论;谢谢你的轻推。@DaveNewton什么才是真正理想的,尽管我认为那将是一场噩梦。将为struts2配置创建一个正式的数据模型(ER图),允许一个扩展点将struts2配置存储在DB中(然后一个插件可以默认支持内存中的选项)。然后struts2将对所有事务使用此单一模型。然后在更新模型时,新请求可以排队,直到旧请求完成,然后加载新请求。就目前情况而言,你不得不处理不可变的集合,这只是一种痛苦。