2014-03-31 66 views
3

我有一個使用的Struts(版本2.3.16.1 GA)的應用程序和Spring(3.2.4版GA)注入物體進入操作等使用一個Struts應用程序

現在裏面春天控制器,我需要爲我的應用程序創建一個REST API,並且我不能使用Struts的REST插件,所以我認爲,既然Spring已經存在了,我可以創建Spring控制器,然後使用Spring來提供API。

說我目前的應用程序在服務器上的「應用程序」上下文中運行,所以我會訪問它是這樣的:

http://www.myserver.com:8080/app/some/path/anAction.action 

然後這就是我如何當前應用工程的整個流程。現在正是我打算做的,是創造將完全由我的REST API使用特定的路徑,所以我試圖使像這樣的工作,例如:

http://www.myserver.com:8080/app/api/users 

我要地圖/api/*春,所以我所有的控制器都會住在那裏。 下面是我爲了完成這個而做的配置的相關位。

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); 
    } 
} 

這就是我認爲我應該擁有的所有配置。現在,我啓動服務器,登錄到應用程序(使檢查支柱保持工作正常),然後嘗試發送一個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

+1,我喜歡這個問題:)但是你展示這一切? SignOnFilter在日誌中是什麼,但不在代碼中? –

+0

爲什麼你不能使用S2 rest插件? –

+0

@AleksandrM我不能使用它,因爲根據我的理解,它依賴於約定插件,並且這將需要對當前代碼進行大量重構,以使其以這種方式工作 – alejo

回答

0

沒有映射是因爲你沒有映射它正確

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

謝謝。我已經嘗試過那個,但是我得到了和原始問題相同的警告。 – alejo

相關問題