2015-04-06 37 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'。 –