2015-04-06 31 views
2

我有一個帶註釋的休息控制器,如下所示。我能夠得到的服務託管很好,但只有當我設置爲每個服務在web.xml中的完整路徑:Spring 4 RestController調度器url模式

@RestController 
@RequestMapping("/service/") 
public class StuffRestController 
{ 
    @RequestMapping("/getStuffList") 
    public List<Stuff> getStuffList() { 
     ... make stuff ... 
     return stuffList; 
    } 

    ... many other similar services ... 
} 

這確實是我的應用程序的唯一春天資源;雖然,我們正在使用彈簧安全。下面

是唯一的線spring4-servlet.xml中:

<mvc:annotation-driven /> 

<context:component-scan base-package="com.me.stuff.presentation.controller" /> 
<context:component-scan base-package="com.me.stuff.security" /> 

的StuffRestController類駐留在 「...控制器」 包。

的web.xml:

<servlet>  
    <servlet-name>spring4</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <init-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>WEB-INF/spring4-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup>  
</servlet> 
<servlet-mapping>  
    <servlet-name>spring4</servlet-name>  
    <url-pattern>/service/getStuffList</url-pattern> 
</servlet-mapping> 

上述所有的其實一切工作正常和花花公子,但在這個控制器還有其他30個服務,我寧願不做出新的servlet映射每個方法。當我嘗試「映射」通配符時會發生此問題。我試過/ service/,/ service和/ service/*。和其他許多組合。

大多數人都根本沒有正確映射,我收到404錯誤。如果我使用/服務/ *會搞調度Servlet時/服務/ getStuffList被調用,但它與迴應:

WARNING: No mapping found for HTTP request with URI [/myapp/service/getStuffList] in DispatcherServlet with name 'spring4' 

我敢肯定,這是如何創建的URL映射簡單的東西,但它正在逃避我。

+0

什麼是您打的URL? –

+0

「http:// localhost:8080/myapp/service/getStuffList」...如果我在後期配置了web.xml,但是我更喜歡捕獲所有URL模式一切/服務/和更低。 – slambeth

回答

4

問題是,您在DispatcherServlet@RestController請求映射中都包含路徑:/service/getStuffList。因此,要訪問其他控制器的方法,你已經打了以下網址:

{contextPath}/service/getStuffList/service/getStuffList 

所以,要麼改變調度服務器URL模式來/,所以它會處理每一個請求來到你的應用程序,然後根據路徑myApp後,將重定向到適當的控制器。或者,將RestController映射設置爲/*。你應該更喜歡前一種方法。

如果您想讓您的servlet處理請求在/service處發生,請將url-pattern更改爲/service/*。但是,您必須從類級別刪除所有請求映射。否則,在當前情況下,你已經打了以下網址:

{contextPath}/service/service/getStuffList 

不過,如果你想在路徑解析(即調度服務器URL模式,你要的類別在/service也映射將servlet映射到該路徑),您可以將alwaysUseFullPath屬性設置爲URL處理程序映射的true。爲此,請將以下內容添加到您的spring上下文xml文件中:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name = "alwaysUseFullPath" value = "true" /> 
</bean> 
+0

謝謝先生......我對映射如何與註釋相互作用存在誤解。你的回答讓我得出結論。使用「/」不是這個應用程序的真正選擇,我們只是增加了使用@RestController的彈簧。我改變了我的映射到/spring/*,並且[host]/[context]/spring/service/getStuffList按我期望的那樣響應。 – slambeth

+0

@slambeth不客氣。順便說一句,你也可以將它映射到'/ service/*'並設置我在我的答案中引用的屬性,並使用'/ service/getStuffList'。 –