2014-01-15 67 views
5

獲得404我試圖訪問我寫了一個RESTful Web服務:上簡單的Spring 4 REST服務

http://localhost:8080/dukegen/ws/family/1 

但用在瀏覽器地址欄中得到一個404,不知道是什麼原因。我正在嘗試返回JSON。我已經把傑克遜2在我的類路徑:

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.3.1</version> 
</dependency> 

這裏是服務器輸出:

Jan 14, 2014 8:29:55 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler 
INFO: Mapped URL path [/ws/family/{familyId}] onto handler 'familyResource' 
Jan 14, 2014 8:29:55 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler 
INFO: Mapped URL path [/ws/family/{familyId}.*] onto handler 'familyResource' 
Jan 14, 2014 8:29:55 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler 
INFO: Mapped URL path [/ws/family/{familyId}/] onto handler 'familyResource' 
Jan 14, 2014 8:29:55 PM org.springframework.web.servlet.FrameworkServlet initServletBean 
INFO: FrameworkServlet 'dispatcher': initialization completed in 360 ms 
Jan 14, 2014 8:29:55 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound 
WARNING: No mapping found for HTTP request with URI [/dukegen/ws/family/1] in DispatcherServlet with name 'dispatcher' 

這裏是我的控制器:

@Controller 
@RequestMapping("ws") 
public class FamilyResource { 

    @RequestMapping(value="family/{familyId}", method = RequestMethod.GET, produces="application/json") 
    public @ResponseBody Family getFamily(@PathVariable long familyId) { 
      .... builds Family object .... 
      return family; 
     } 

} 

這裏是我的調度員在網路設定。 xml:

<servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath:/mvcContext.xml</param-value> 
     </init-param> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/ws/*</url-pattern> 
    </servlet-mapping> 

我的mvcContext.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:component-scan base-package="ws.hamacher.dukegen.resource"/> 

</beans> 

任何幫助將不勝感激。

回答

16

幾件事情在這裏不正確。

首先,在您的請求映射,將它們映射應該是一致的 我的意思是你們班應該被映射到"/ws"和你的方法產生的結果應該是"/family/{familyId}"

而且,在你的web.xml你已將servlet配置爲響應/ws/*,並且您的控制器再次請求映射到ws。 這不會工作。 一旦您的servlet攔截了"/ws/*",它不應該在請求映射中重複。 Controller僅在其上下文中響應URL模式。這裏的"/ws"後面的內容只在控制器的上下文中。 我通常更喜歡將servlet映射到"/"以及控制器內的所有其他分辨率。只是我的偏好,但任何事情都可以。

所以正確的配置是

的web.xml

<servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath:/mvcContext.xml</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

和控制器

@Controller 
    @RequestMapping("/ws") 
    public class FamilyResource { 
     @RequestMapping(value="/family/{familyId}", method = RequestMethod.GET, produces="application/json") 
     public @ResponseBody Family getFamily(@PathVariable long familyId) { 
      .... builds Family object .... 
      return family; 
     } 
    } 
+0

這個工作。我很感激。 – badgerduke

+0

優秀的答案。 – David

+0

我有一個我想要託管的靜態文件,但在匹配所有內容的url模式中有一個斜槓阻止了我這樣做。所以我不得不使用不同的URL映射,比如'ws'。謝謝。 –