【问题标题】:Removing convention.annotation - replace with config in struts.xml删除convention.annotation - 替换为struts.xml 中的配置
【发布时间】:2013-01-29 14:57:47
【问题描述】:

我在从操作中删除 @Action@Result Convention 插件注释并将它们替换为 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 中有一个“捕获所有”结果 - 整个 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 正在被读取,因为如果我删除动作映射“汽车”,那么自动完成功能将被禁用(但这需要我试图删除的注释以验证这一点)。

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

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

【问题讨论】:

    标签: struts2 struts2-convention-plugin


    【解决方案1】:

    就目前而言,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 下以禁止直接客户端访问。

    【讨论】:

    • 是的,我从 struts.xml 中删除了约定常量,现在可以按预期工作-也许更重要的是-以我理解的方式工作-我对注释的经验仅限于依赖注入的基本 Spring 注释.戴夫,您的知识令人印象深刻,并且像您一样耐心地提供帮助是非常高尚的。谢谢!
    • @KenAlton Aw shucks;没问题。一开始要考虑很多事情,但是一旦您知道要寻找问题的地方,事情就会开始变得更快:)
    • +1 虽然我强烈支持 struts2-conventions-plugin,但 xml 映射可能会发生奇怪的事情,并且 config-browser-plugin 会感到困惑并会说出正确的谎言。从插件来看,获取actions的状态并不是那么容易。动作处理不是一个特别统一的东西,我真的希望它更加统一,因为如果你可以准确(并且容易)确定某些处理,一些有趣的事情是可能的......并且在运行期间修改struts2处理有点困难时间。抱歉,主要是 OT,但确实指出了为什么它不合作。
    • @Quaternion 我同意;添加约定包可能会导致违反直觉的行为。我不确定使浏览器插件合作的最佳方法是什么,尽管现在有一个插件排序机制(IIRC)可能会更容易。作为相关副项目的一部分,我可能会对此进行探讨;感谢您的推动。
    • @DaveNewton 真正理想的是什么,尽管我认为这将是一场噩梦。将为struts2配置创建一个正式的数据模型(ER图),允许一个扩展点将struts2配置存储在数据库中(然后一个插件可以默认支持一个默认的内存选项)。然后 struts2 将对所有事务使用这个单一模型。然后在更新模型时,新请求可以排队,直到旧请求完成,然后加载新请求。就目前而言,您必须处理不可变集合,这只是一种痛苦。
    猜你喜欢
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多