2010-06-22 25 views
2

我對Spring 3 MVC嘗試構建REST風格的Web服務感到沮喪。如何在Spring 3 MVC中獲得RESTful URL?

我想要RESTful URL,例如「my.domain.com/items」,而不是「my.domain.com/items.do」或其他任何包含擴展名的文件。我的web.xml包含以下內容。注意URL模式:

<servlet> 
    <servlet-name>addictedWebServices</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>addictedWebServices</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

我addictedWebServices-servlet.xml中包括以下視圖解析:

<bean id="viewResolver2" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
<property name="prefix" value="/WEB-INF/jsp/"/> 
<property name="suffix" value=".jsp"/> 

我的控制器之一包括以下方法:

@RequestMapping(value = "/shoutouts", method = RequestMethod.POST) 
public String post(@RequestBody ShoutOut shoutOut) { 

    logger.info("In shout outs controller: post()."); 

    shoutOutDao.save(shoutOut); 

    return "OK"; 

} 

一切的方法執行罰款時,我要在此URL,但是當春天去顯示/WEB-INF/jsp/OK.jsp,我得到以下警告:

2010-06-22 18:34:51,993 WARN [http-8080-2] org.springframework.web.servlet.PageNotFound (DispatcherServlet.java:965) - No mapping found for HTTP request with URI [/addicted/WEB-INF/jsp/OK.jsp] in DispatcherServlet with name 'addictedWebServices' 

和Tomcat拋出了一個404它出現在DispatcherServlet的處理URL,因爲我的servlet-mapping的url-pattern被設置爲/ **。我怎樣才能解決這個問題?如果我將servlet-mapping url-pattern更改爲**。do,然後對我的Spring MVC註釋進行所有相關更改,那麼一切都會正常執行。

感謝您的幫助!

+0

見http://stackoverflow.com/questions/2977446 /噸iles-2-and-no-mapping-found-for-http-request-with-uri-spring-mvc/2977549#2977549和http://stackoverflow.com/questions/2946995/java-jsp-servlet-controller- servlet-throwing-the-famous-stack-overflow/2949077# – axtavt 2010-06-22 17:51:55

回答

1

隨着該ViewResolver的春天即將前綴/ WEB-INF/JSP」和後綴的.jsp每一個觀點,因爲你回到它假設你是返回一個視圖名稱的字符串。

你需要得到擺脫那InternalResourveViewResolver,並在你的servlet的XML文件中使用MVC-註解驅動標籤

更新:

既然你想的RESTful你不應該返回任何JSP頁面都使擺脫在你的servlet-xml文件中添加「」,刪除JstlView bean和其他的vie你定義的w豆。並將@ResponseBody註釋添加到您的控制器。

0

如果「OK」是你想實際效果,那麼你必須@ResponseBody註釋添加到這個方法

+0

對不起,這不是我正在尋找..我想要「OK」來解析爲「WEB-INF/jsp/OK.jsp」,那就是發生了什麼......但Spring DispatcherServlet正在捕獲請求,因爲servlet映射url-pattern被設置爲「/ *」 – Diego 2010-06-22 18:07:49

+0

那麼這不是一個REST風格的Web服務。要以這種基本方式獲得RESTful,您的POST請求應該使用@ResponseStatus(HttpMethod.CREATED)返回201(創建)響應代碼。 – 2010-06-22 18:12:44

+0

謝謝,我仍然想知道如何獲得REST風格的URL,但也能夠解析.jps的,.ftl等。我在這裏問了一個類似的問題: http://stackoverflow.com/questions/ 3212746 /彈簧MVC-寧靜的URL-freemarker的瓷磚彈簧的宏燦這些工作對 – Diego 2010-07-09 12:59:55

0

感謝您的答覆。如果我理解正確的話,我可能已經嘗試過這個..我註釋掉InternalResourveViewResolver,我把在addictedWebServices-servlet.xml中如下:

<bean id="OK" class="org.springframework.web.servlet.view.JstlView"> 
    <property name="url" value="/WEB-INF/jsp/OK.jsp"/> 
</bean> 

我得到了同樣的警告,並從Tomcat 404。 Spring DispatcherServlet似乎仍處理該URL

1

將URL模式更改爲'/'。

的web.xml:

<servlet> 
    <servlet-name>addictedWebServices</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>addictedWebServices</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

addictedWebServices小服務程序。XML

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

唯一的缺點是,你需要添加映射你想要的容器沒有Spring的干預處理任何資源,例如:

<servlet-mapping> 
    <servlet-name>default</servlet-name> 
    <url-pattern>*.css</url-pattern> 
</servlet-mapping> 
0

基本上採取例如

@RequestMapping(value = "/{shoutouts}", method = RequestMethod.POST)
public @RequestBody String post(@PathVariable("shoutOut") String shoutOut) {
logger.info("In shout outs controller: post().");
shoutOutDao.save(shoutOut);
return "OK";
}

因爲字符串之前 @RequestBody

發佈然後返回「OK」考慮爲純響應

如果刪除@ResponseBody註釋,然後返回「OK」認爲是視圖不普通響應所以它會尋找 「OK.jsp」 內/ WEB-INF/JSP /當你設置 「..- servlet.xml的」 路徑文件