将我的应用程序升级为使用Spring Boot 2.1.8版时。使用struts2 core版本2.5.20发布struts2约定插件操作未正确映射,我收到错误消息
通用域名格式。开放交响乐团。xwork2。配置。ConfigurationException:没有为与上下文路径[]关联的命名空间[/]和操作名称[home]映射的操作。
如果我在struts.xml
中定义动作,它们会完美地工作。
下面是我当前的配置,为什么它们没有映射?
我尝试了许多不同的配置,但似乎没有任何效果,StrutsPrepareAndExecuteFilter正在启动,但没有找到动作,就好像Spring没有扫描它们一样。这可能是一个依赖版本问题吗?
application.yaml
server:
port: 8080
servlet:
context-path: /
Struts2.xml
<struts>
<constant name="struts.devMode" value="false" />
<constant name="struts.convention.action.packages" value="com.myactions.action" />
<constant name="struts.convention.action.includeJars" value=".*?/myjar.*?jar(!/)?,.*?/myjar*?jar(!/)?" />
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.objectFactory.spring.autoWire" value="name" />
<constant name="struts.multipart.maxSize" value="100000000" />
<constant name="struts.convention.default.parent.package" value="struts-default"/>
## THIS WORKS
<!-- <package name="home" extends="struts-default">-->
<!-- <action name="actionHome" class="com.myactions.action.HomeController" method="actionHome">-->
<!-- <result name="success">home.jsp</result>-->
<!-- </action>-->
<!-- </package>-->
</struts>
控制器
@Namespace("/")
public class HomeController extends BaseController {
@Action("home")
public String actionHome() throws Exception {
return SUCCESS;
}
}
主要的
@SpringBootApplication
@ServletComponentScan
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
return springApplicationBuilder.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Struts2滤波器
@WebFilter("/*")
public class Struts2Filter extends StrutsPrepareAndExecuteFilter {
}
使现代化
经过spring2约定插件
之后,类PackageBasedActionConfigBuilder
有一个方法buildUrlSet
,它将所有url
获取到需要扫描操作的类中,这是将
url
删除到我的类中,因此没有扫描任何内容。
有一个条件
排除父母类装载机
需要设置为false
(第415行)。
解决方案
设置为低于常数-
<constant name="struts.convention.exclude.parentClassLoader" value="false" />
<constant name="struts.convention.action.fileProtocols" value="jar,code-source" />
经过几天的反复试验,以下是一些线索。
Spring启动2.1.8与Struts 2.5.20配置struts.xml工作。您的项目POM至少需要以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.8</version>
</dependency>
...
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.5.20</version>
</dependency>
我还建议添加配置浏览器插件,以便轻松列出可用的操作:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-config-browser-plugin</artifactId>
<version>2.5.20</version>
</dependency>
当您打包以下内容时,它会起作用:
为了摆脱struts。xml并仅通过Java类配置操作,需要约定插件:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.5.20</version>
</dependency>
笔记:
删除struts.xml后,公约插件将接管,操作类将使用包和类的名称进行映射。由于一组注释,默认约定(动作到URL映射、结果路径...)也可以被覆盖。
尽管如此,正如OP所提到的,通过注释进行配置并不能与嵌入式Tomcat一起开箱即用(尽管它与外部Tomcat一起使用)。
到目前为止,我能做的最好的事情是使用嵌入式Jetty而不是Tomcat,并将推荐的配置添加到struts中。特性:
struts.convention.exclude.parentClassLoader=false
struts.convention.action.fileProtocols=jar,code-source
开始日志仍然显示错误,但我可以访问配置的操作,而无需更多的XML。
使现代化
在OP的更新之后,我挖掘了更多。通过执行以下操作,约定插件可以很好地与Tomcat embedded配合使用,并且不需要XML:
>
将以下行添加到struts.properties
struts.convention.exclude.parentClassLoader=false
升级asm模块asm、asm共享资源和asm树到6.2或更高版本,以防止类似于
ERROR org.apache.struts2.convention.DefaultClassFinder.<init>:95 - Unable to read class [...]
WordPress actions 允许作为插件作者的你插入到WordPress 应用中并且执行一段代码。一个Action 的例子就是,你 想要在一个用户发布完一篇文章或者留下一篇留言的时候执行一个动作。 一些我使用极其频繁的Action 有: admin_menu:允许你给你的插件设置一个管理面板。 wp_head:允许你将代码插入到博客的<head>标签内。 Action在行动 当定义一个Wo
我试图用strut 2应用程序配置spring插件,而strut 2应用程序已经用常规插件运行了,所以我使用了注释。我使用ExtJs提交表单,在我引入spring插件之前,它最初工作得很好,现在ajax请求无法定位操作,并且在firebug中没有显示任何响应。 绒球.xml struts.xml web.xml applicationContext.xml 操作类 Ajax请求火虫报告,XML选项
给定以下类的,使用Java 8 lambda,我希望获得的,每个帐户类型一个。 到目前为止,我使用以下代码按对进行分组。 如何返回,将列表从每个映射键传递到构造函数中,其中包含每个中的一个?
我使用的是maven release插件,出现以下错误: [错误]无法执行目标组织。阿帕奇。专家plugins:maven release plugin:2.5.3:prepare(默认cli)on project***:“******”的版本未映射- 我从詹金斯那里运行这个任务,源代码在perforce中。我错过了什么?谢谢
我已经设置了一个项目,它是Struts2 Springs JPA的组合。 我最近遇到了Struts2-JQuery插件 使用这个插件(struts2-jquery-plugin-3.5.1.jar)在我的项目我得到了一个错误 这个特殊错误的解决方案在这里作为Struts2 DTD问题给出。 按照上述链接中给出的解决方案行事。。更新了my webapp lib文件夹中的三个库: Struts2-co
我编写了一个没有父级的简单pom.xml来尝试这个方法,因此不涉及pluginManagement。我还检查了maven-model-builder中的super super pom-4.0.0.xml以确认maven-bundle-plugin不存在。此插件版本没有指定在任何地方。 maven如何确定采用哪个版本?