首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧4 RestController调度员url-模式

弹簧4 RestController调度员url-模式
EN

Stack Overflow用户
提问于 2015-04-06 16:19:59
回答 1查看 8.6K关注 0票数 4

我有一个带注释的rest控制器,如下所示。我能够让这些服务很好地托管,但前提是我必须为web.xml中的每个服务配置完整的路径:

代码语言:javascript
复制
@RestController
@RequestMapping("/service/")
public class StuffRestController
{
    @RequestMapping("/getStuffList")
    public List<Stuff> getStuffList() { 
      ... make stuff ...
      return stuffList;
    }

    ... many other similar services ...
}

这确实是我的应用程序中唯一的spring资源;不过,我们使用的是spring安全性。

下面是惟一的spring4 4-servlet.xml行:

代码语言:javascript
复制
<mvc:annotation-driven />  

<context:component-scan base-package="com.me.stuff.presentation.controller" />  
<context:component-scan base-package="com.me.stuff.security" />

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

web.xml:

代码语言:javascript
复制
 <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个错误。如果我使用/service/*,则在调用/service/getStuffList时,它将调用dispatcher servlet,但它的响应是:

代码语言:javascript
复制
WARNING: No mapping found for HTTP request with URI [/myapp/service/getStuffList] in DispatcherServlet with name 'spring4'

我确信这与URL映射的创建方式是很简单的,但这是在逃避我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-06 16:27:37

问题是您已经在/service/getStuffListDispatcherServlet请求映射中都包含了path:@RestController。因此,要访问rest控制器方法,您必须点击以下URL:

代码语言:javascript
复制
{contextPath}/service/getStuffList/service/getStuffList

因此,要么将dispatcher servlet url模式更改为/,这样它将处理传入应用程序的每个请求,然后根据myApp后的路径将其重定向到适当的控制器。或者,将RestController映射设置为/*。你应该更喜欢前一种方法。

如果您想让servlet句柄请求出现在/service上,那么将url模式更改为/service/*。但是,您必须从类级别删除所有请求映射。否则,在当前情况下,您必须访问以下url:

代码语言:javascript
复制
{contextPath}/service/service/getStuffList

但是,如果希望在路径解析中包括dispatcher servlet URL模式(即您希望在/service映射类并将servlet映射到该路径),则可以将alwaysUseFullPath属性设置为alwaysUseFullPath处理程序映射的true。为此,将以下内容添加到spring上下文xml文件中:

代码语言:javascript
复制
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name = "alwaysUseFullPath" value = "true" />
</bean>
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29475137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档