我有一个旧项目,它使用xml配置的struts2映射。我想让它更新鲜一点,并使用注释映射,就像在springmvc中那样。所以我发现,支柱2允许这样做。但在我添加之后
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>${org.apache.struts.version}</version>
</dependency>
到我的pom-xml。我的xml配置已停止工作。
以下是我的struts.xml
:
<action name="my/home" class="my.dhblah.MyAction">
<result type="redirectAction">my/home/search</result>
</action>
我从maven pom中删除了插件。我调试了struts,在proxy.getConfig()
线上的DefaultActionInvocation.createResult()
中看到的内容如下:
result = {com.opensymphony.xwork2.config.entities.ActionConfig@10444}"{ActionConfig my/home (my.dhblah.MyAction) - null}"
interceptors = {java.util.Collections$UnmodifiableRandomAccessList@10447} size = 20
params = {java.util.Collections$UnmodifiableMap@10448} size = 0
results = {java.util.Collections$UnmodifiableMap@10449} size = 2
exceptionMappings = {java.util.Collections$UnmodifiableRandomAccessList@10450} size = 1
className = {java.lang.String@10451}"my.dhblah.MyAction"
methodName = null
packageName = {java.lang.String@10452}"my"
name = {java.lang.String@10453}"my/home"
allowedMethods = {java.util.Collections$UnmodifiableSet@10454} size = 1
location = null
当我展开"results"
部分时,我看到了映射"success"
和"exception"
的两个结果
在pom.xml
中启用插件后,我在同一行上看到以下内容:
config = {com.opensymphony.xwork2.config.entities.ActionConfig@10457}"{ActionConfig home (my.dhblah.MyAction.execute()) - null}"
interceptors = {java.util.Collections$UnmodifiableRandomAccessList@10460} size = 18
params = {java.util.Collections$UnmodifiableMap@10461} size = 0
results = {java.util.Collections$UnmodifiableMap@10462} size = 0
exceptionMappings = {java.util.Collections$UnmodifiableRandomAccessList@10463} size = 0
className = {java.lang.String@10464}"my.dhblah.MyAction"
methodName = {java.lang.String@10395}"execute"
packageName = {java.lang.String@10465}"my.dhblah#convention-default#/my"
name = {java.lang.String@10466}"home"
allowedMethods = {java.util.Collections$UnmodifiableSet@10467} size = 1
location = null
在我点击该网址后,我出现了以下错误:
Struts Problem Report
Struts has detected an unhandled exception:
Messages:
No result defined for action my.dhblah.MyAction and result success
Stacktraces
No result defined for action my.dhblah.MyAction and result success
com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)
我没有将@Action
注释添加到MyAction
中,但约定插件似乎在查看xml配置之前会拾取旧的Action
类并构建映射配置,这就是为什么我有一个错误,即"success"
结果上没有映射任何内容。
有人遇到这个问题吗?如何解决?
这些是不同的操作配置。但是,当您通过Struts配置映射您的操作时,检索操作映射的逻辑是由操作映射器实现和执行的。有一个默认的操作映射器实现,它是默认使用的。您应该知道,约定插件将其配置附加到xml配置中。因此,您可能在运行时配置了重复的操作。很难预测动作映射器将拾取哪些配置元素来构建动作映射。要解决这类配置问题,您可以使用配置浏览器插件。
Config Browser是一个简单的工具,可以帮助您在运行时查看Struts配置。当调试可能与配置问题有关的问题时,它非常有用。
要安装插件,只需将其添加到依赖
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-config-browser-plugin</artifactId>
<version>${org.apache.struts.version}</version>
</dependency>
这个插件可以通过将插件jar复制到应用程序的
/WEB-INF/lib
目录来安装。