Spring 4 RestController Dispatcher url-pattern

sla*_*eth 4 java spring

我有一个带注释的休息控制器,如下所示.我能够获得主机服务,但前提是我在web.xml中为每个服务配置完整路径:

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

    ... many other similar services ...
}
Run Code Online (Sandbox Code Playgroud)

这是我应用程序中唯一的弹簧资源; 虽然,我们正在使用弹簧安全.

以下是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" />
Run Code Online (Sandbox Code Playgroud)

StuffRestController类驻留在"... controller"包中.

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> 
Run Code Online (Sandbox Code Playgroud)

以上所有实际上都运行良好和花花公子,但在这个控制器中还有30个其他服务,我宁愿不为每个方法创建一个新的servlet映射.当我尝试"通配"映射时,会出现此问题.我试过/ service/,/ service和/ service/*.还有很多其他组合.

大多数都没有正确映射,我收到404错误.如果我使用/ service/*,它会在调用/ service/getStuffList时使用调度程序servlet,但它会响应:

WARNING: No mapping found for HTTP request with URI [/myapp/service/getStuffList] in DispatcherServlet with name 'spring4'
Run Code Online (Sandbox Code Playgroud)

我确信这对于URL映射的创建方式来说很简单,但它让我无法理解.

Roh*_*ain 6

问题是你已经/service/getStuffList在你的DispatcherServlet@RestController请求映射中包含了路径:因此,要访问其余控制器方法,您需要访问以下URL:

{contextPath}/service/getStuffList/service/getStuffList
Run Code Online (Sandbox Code Playgroud)

因此,要么将调度程序servlet url-pattern更改为/,所以它将处理到您的应用程序的每个请求,然后基于路径myApp,将重定向到适当的控制器.或者,将RestController映射设置为/*.你应该更喜欢前一种方法.

如果您想要处理servlet处理请求/service,请将url-pattern更改为/service/*.但是,您必须从类级别删除所有请求映射.另外在当前情况下,您需要点击以下网址:

{contextPath}/service/service/getStuffList
Run Code Online (Sandbox Code Playgroud)

但是,如果要在路径解析中包含调度程序servlet url-pattern(即,您希望将类/service映射到该映射并将servlet映射到该路径),则可以将alwaysUseFullPath属性设置true为URL处理程序映射.为此,将以下内容添加到spring context xml文件中:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name = "alwaysUseFullPath" value = "true" />
</bean>
Run Code Online (Sandbox Code Playgroud)