如何检查Struts2中命名空间内是否存在操作?

如何检查Struts2中命名空间内是否存在操作?,struts2,namespaces,action,Struts2,Namespaces,Action,我想在Struts2 web应用程序中使用自己的ActionMapper实现某种url回退。这意味着: 什么时候 不存在,我希望ActionMapper尝试加载,例如 相反 解析URL并因此找到名称空间不是问题,但我不知道如何确定所需的操作是否存在于该名称空间中,如果不存在,我必须修改该名称空间 在这种情况下,是否可以检查命名空间/foo/bar中是否存在操作?或者是否有其他机制来执行我打算做的事情 谢谢 Gregor您必须为每个配置的命名空间执行此操作: <action name="*"

我想在Struts2 web应用程序中使用自己的ActionMapper实现某种url回退。这意味着:

什么时候

不存在,我希望ActionMapper尝试加载,例如

相反

解析URL并因此找到名称空间不是问题,但我不知道如何确定所需的操作是否存在于该名称空间中,如果不存在,我必须修改该名称空间

在这种情况下,是否可以检查命名空间/foo/bar中是否存在操作?或者是否有其他机制来执行我打算做的事情

谢谢


Gregor

您必须为每个配置的命名空间执行此操作:

<action name="*">
    <result type="redirectAction">your fallback action here</result>
</action>

如果它不起作用,请将struts.enable.slassessionnames设置为false。

我解决了我的问题。这在自定义ActionMapper中发生:

为了查明是否存在操作,我首先构造一个包含所需操作名称空间的类名字符串。然后我打电话

Class.forName("namespaceroot.foo.bar.myaction");
如果该操作不存在,将抛出ClassNotFoundException异常,我可以在try{…}catch{…}块中检查该异常。在catch块中,我可以将映射的名称空间更改为回退名称空间。这对ActionProxy有一些影响:命名空间也必须在getMappingFromActionName中进行更改。否则,ActionProxy包含请求的名称空间,这通常很好。DefaultActionProxy没有用于命名空间的setter,因此我对其进行了子类化,并使用自定义AxtionProxyFactory创建了它。呸


这不是很优雅,但只要我不想出更好的主意,它就会一直这样。我很想听到更好的解决方案

如果我理解正确,这将执行回退操作。我需要的是一个后备/名称空间/。但是,我使用一个定制的ActionMapper解决了这个问题,并在getMapping方法中更改了名称空间(如果需要)。ActionProxy也必须获得新的名称空间,因此我通过为名称空间添加一个setter对其进行了扩展。希望这不会让你想起: