How do configure struts convention plugin with struts-spring plugin with Action class mapped with annotations

落爺英雄遲暮 提交于 2019-11-27 08:35:03

问题


I am trying to configure spring plugin with strut 2 application which is already running with convention plugin, so I am using annotations. I am using ExtJs for my form submission which was initially working well until I introduced the spring plugin, now the the ajax request cannot locate the actions and it's not showing any response in firebug.

pom.xml

    <!-- struts 2 dependencies -->
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>${struts2.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-convention-plugin</artifactId>
    <version>${struts2.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-json-plugin</artifactId>
    <version>${struts2.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-spring-plugin</artifactId>
    <version>${struts2.version}</version>
</dependency>

<!-- Import the CDI API -->
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-cdi-plugin</artifactId>
    <version>${struts2.version}</version>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
    <artifactId>cdi-api</artifactId>
    <version>1.0-SP1</version><!--$NO-MVN-MAN-VER$-->
    <scope>provided</scope>
</dependency>

<!-- Spring framework -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
</dependency>

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.custom.i18n.resources" value="ApplicationResources" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.convention.result.path" value="/content" />
    <constant name="struts.multipart.saveDir" value="/tmp" />
    <constant name="struts.multipart.maxSize" value="4194304" />
    <constant name="struts.action.excludePattern" value="/api/.*?" />

</struts>

web.xml

<display-name>Application</display-name>
<welcome-file-list>
  <welcome-file>index.html</welcome-file>
</welcome-file-list>

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>  
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
</listener> 

<servlet>
  <servlet-name>Resteasy</servlet-name>
  <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>Resteasy</servlet-name>
  <url-pattern>/api/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
  <param-name>resteasy.servlet.mapping.prefix</param-name>
  <param-value>/api</param-value>
</context-param>
<listener>
  <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xsi:schemaLocation="
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
</beans>

Action Class

@Namespace("/units")
@Result(
    type = "stream",
    params = {
        "inputName", "stream"
    }
)
public class PropertyTypeAction extends BaseAction implements ActionImpl{

    @PersistenceUnit
    private EntityManagerFactory emf;

    @Action(value="add")
    public String add() {
        .......

    }
}

Ajax Request firebug report, XML tab

XML Parsing Error: no element found Location: moz-nullprincipal:{7fc640bd-f293-4956-8cf2-178765cec735} Line Number 1, Column 1:

My question is how can I configure struts-spring plugin to work with struts convention plugin with the annotations.


回答1:


You are importing both the struts2-spring-plugin, and the struts2-CDI-plugin.

Don't.

Choose only one of the above plugins, and then configure it properly:

  • To use the CDI plugin, simply import the JAR with Maven and start annotating the objects you want to be injected with the (right) @Inject annotation.

  • To use the Spring plugin, import the JAR, add the ContextLoaderListener in web.xml (that you have already set), and specify that you want to use Spring as objectFactory in struts.xml, with the constant:

    <constant name="struts.objectFactory" value="spring" /> 
    

IMHO the CDI plugin is the better option, if you are using Java EE >= 6.



来源:https://stackoverflow.com/questions/28804031/how-do-configure-struts-convention-plugin-with-struts-spring-plugin-with-action

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!