2010-06-22 31 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的” 路径文件