java - 在 Struts 2 中使用 Spring Controller 创建 REST API

标签 java spring rest spring-mvc struts2

我有一个应用程序使用 Struts(版本 2.3.16.1 GA)和 Spring(版本 3.2.4 GA)将对象注入(inject) Action 等。
现在,我需要为我的应用程序创建一个 REST API,而我不能为此使用 Struts 的 REST 插件,所以我认为既然 Spring 已经出现,我可以创建 Spring Controller ,然后使用 Spring 提供 API。
假设我当前的应用程序在 app 中运行服务器上的上下文,所以我将像这样访问它:

http://www.myserver.com:8080/app/some/path/anAction.action
这就是我当前应用程序的整个流程的工作方式。现在我打算做的是创建一个将由我的 REST API 专门使用的特定路径,所以我尝试让它像这样工作,例如:
http://www.myserver.com:8080/app/api/users
我要 map /api/*到 Spring,所以我所有的 Controller 都会住在那里。
这是我为完成此操作所做的配置的相关位。
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 是否正常工作),然后尝试向我的 REST 端点发送 GET 请求,以下是日志:
日志:
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'

最佳答案

没有映射是因为你没有正确映射它

@RequestMapping(value="/api/users", method=GET)

关于java - 在 Struts 2 中使用 Spring Controller 创建 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22768655/

相关文章:

java - 如何使其中包含 Date 对象的类不可变?

java - JVM 垃圾收集和内存中 Java 数据库

java - 使用 Spring Boot 查询 MySQL 数据库时,SQL 查询返回未找到列 'id'

java - 覆盖 CORS 配置

web-services - WS 被认为是 Restful 要求

java - JAXB 内部元素被忽略

java - 在 IBM bluemix 中使用空间数据

spring - 使用H2数据库创建表

java - 如何在 Spring 中手动启动共享 EntityManager 上的事务?

java - REST 服务 ClassNotFoundException (com.sun.jersey.spi.container.servlet.ServletContainer)