我有一个使用Struts(版本2.3.16.1 GA)和Spring(版本3.2.4 GA)将对象注入Actions等的应用程序。
现在,我需要为我的应用创建一个REST API,而我无法使用Struts' REST插件,所以我认为自从Spring已经存在,我可以创建Spring控制器,然后使用Spring提供API。
说我当前的应用程序在' app'服务器上的上下文,所以我将这样访问它:
http://www.myserver.com:8080/app/some/path/anAction.action
接下来我的当前应用程序的整个流程如何运作。现在我打算做的是创建一个将由我的REST API独占使用的特定路径,所以我尝试让它像这样工作,例如:
http://www.myserver.com:8080/app/api/users
我想将/api/*
映射到Spring,因此我的所有控制器都将存在。
以下是我为完成此操作而执行的配置的相关位。
web.xml
<filter>
<filter-name>struts-prepare</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
</filter>
<filter>
<filter-name>struts-execute</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-prepare</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>struts-execute</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>rest-api</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.myapp.spring.SpringApplicationConfiguration</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>rest-api</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
struts.xml
<constant name="struts.action.excludePattern" value="/api/*"/>
SpringApplicationConfiguration.java
@Configuration
@EnableWebMvc
@ComponentScan( basePackages = {"com.myapp.controller"})
@Import( {BaseConfig.class, DataBaseConfiguration.class})
public class SpringApplicationConfiguration {}
UserController.java
@Controller
public class UserController {
@Autowired
private UserService service;
@RequestMapping(value="/users", method=GET)
@ResponseBody public List<User> list(@RequestParam(defaultValue = "25") int limit, @RequestParam(defaultValue = "1") int offset, @RequestParam String filter ) {
return service.list(limit, offset, filter);
}
}
我认为我应该拥有的所有配置。现在,我启动服务器,登录到应用程序(所以检查struts是否继续正常工作),然后尝试将GET请求发送到我的REST端点,这里是日志:
INFO [org.springframework.web.servlet.DispatcherServlet] (MSC service thread 1-2) FrameworkServlet 'rest-api': initialization completed in 8939 ms
INFO [org.jboss.web] (MSC service thread 1-2) JBAS018210: Registering web context: /app
INFO [org.jboss.as.server] (DeploymentScanner-threads - 1) JBAS018559: Deployed "app.ear"
INFO [com.app.web.filter.SignOnFilter] (http--0.0.0.0-8443-5) Redirecting to signon: /signon.action?redirectUri=index.action
WARN [org.springframework.web.servlet.PageNotFound] (http--0.0.0.0-8443-3) No mapping found for HTTP request with URI [/app/api/users] in DispatcherServlet with name 'rest-api'
答案 0 :(得分:0)
没有映射是因为您没有正确映射
@RequestMapping(value="/api/users", method=GET)
答案 1 :(得分:0)
问题在于在 struts.xml 中定义您的模式。 改变
<constant name="struts.action.excludePattern" value="/api/*"/>
到
<constant name="struts.action.excludePattern" value="/api/.*"/>