Spring 3具有基于注释的映射的简单无扩展url映射-不可能吗?


问题内容

我正在使用Spring 3,并尝试使用批注设置一个简单的Web应用程序来定义控制器映射。如果不使用 .form或 .do标记所有网址,这似乎非常困难。

由于网站的一部分需要用密码保护,因此这些URL都在/ secure下。<security- constraint>web.xml中有一个保护该根目录下的所有内容。我想将所有Spring控制器映射到/ secure / app /。

URL的示例为:
/ secure / app / landingpage
/ secure / app / edit / customer / {id}
,我将使用适当的jsp / xml / whatever处理每个URL 。

因此,在web.xml中,我有以下内容:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/secure/app/*</url-pattern>
</servlet-mapping>

在despatcher-servlet.xml中,我有这个:

 <context:component-scan base-package="controller" />

在Controller包中,我有一个controller类:

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping("/secure/app/main")
public class HomePageController {
    public HomePageController() { }

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView getPage(HttpServletRequest request)
    {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("main");
        return mav;
    }
}

在/ WEB-INF / jsp下,我有一个“ main.jsp”,并设置了一个合适的视图解析器来指向这一点。使用*
.form映射调度程序时,我的工作正常,但使用上述代码无法正常工作。

当Spring启动时,似乎可以正确映射所有内容:

13:22:36,762  INFO main annotation.DefaultAnnotationHandlerMapping:399 - Mapped URL path [/secure/app/main] onto handler [controller.HomePageController@2a8ab08f]

我还注意到这一行,看起来很可疑:

13:25:49,578 DEBUG main servlet.DispatcherServlet:443 - No HandlerMappings found in servlet 'dispatcher': using default

并且在运行时,任何查看/ secure / app / main的尝试只会在Tomcat中返回404错误,并显示以下日志:

13:25:53,382 DEBUG http-8080-1 servlet.DispatcherServlet:842 - DispatcherServlet with name 'dispatcher' determining Last-Modified value for [/secure/app/main]    
13:25:53,383 DEBUG http-8080-1 servlet.DispatcherServlet:850 - No handler found in getLastModified    
13:25:53,390 DEBUG http-8080-1 servlet.DispatcherServlet:690 - DispatcherServlet with name 'dispatcher' processing GET request for [/secure/app/main]    
13:25:53,393  WARN http-8080-1 servlet.PageNotFound:962 - No mapping found for HTTP request with URI [/secure/app/main] in DispatcherServlet with name 'dispatcher'    
13:25:53,393 DEBUG http-8080-1 servlet.DispatcherServlet:677 - Successfully completed request

那么… Spring映射了一个URL,然后在第二秒之后“忘记”了该映射?到底是怎么回事?

谢谢。


问题答案:

我有和你完全一样的问题。设置“ alwaysUseFullPath”的方法非常简单。我的conf文件如下:

<bean
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
    p:order="3" > <!-- a higher value meaning greater in terms of sorting.  -->
    <property name="alwaysUseFullPath" value="true" />
    <property name="interceptors">
        <list>
            <ref local="myInterceptor" />
        </list>
    </property>
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="alwaysUseFullPath" value="true" />
</bean>