【问题标题】:Spring MVC + GWT RPCSpring MVC + GWT RPC
【发布时间】:2014-10-21 20:59:33
【问题描述】:

我有一个应用程序,前端使用 GWT,后端使用 Spring。我正在尝试使用 Spring MVC 添加一个简单的页面,但映射存在一些问题。

我已经创建了控制器:

@Controller
@RequestMapping("/jobrunner.rpc")
public class JobRunnerController {

    @RequestMapping(method = RequestMethod.GET)
    public String getStartPage() {
        return "jobrunner";
    }
}

当我启动我的应用程序时,有一行关于映射: [DefaultAnnotationHandlerMapping.registerHandler(411)] 将 URL 路径 [/jobrunner.rpc] 映射到处理程序 'jobRunnerController'

但是当我试图打开这个页面时,我在日志中有 404 页面和下一行: [PageNotFound.noHandlerFound(947)] 在名称为“spring-rpc”的 DispatcherServlet 中找不到具有 URI [/rds/jobrunner.rpc] 的 HTTP 请求的映射

也许,web.xml 及其过滤器有问题?这里是:

<session-config>
    <session-timeout>15</session-timeout>
</session-config>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
    <listener-class>com.db.gbs.gbsapps.rds.backend.servlet.listener.StartupListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/application-config.xml</param-value>
</context-param>

<filter>
    <filter-name>AuthenticationFilter</filter-name>
    <filter-class>com.gft.riaframework.backend.api.filters.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>



<filter>
    <filter-name>AuthorizationFilter</filter-name>
    <filter-class>com.db.gbs.gbsapps.rds.backend.services.security.impl.live.CustomAuthorizationFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AuthorizationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>ExpiryFilter</filter-name>
    <filter-class>com.db.gm.adk.server.filter.ExpiryFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>ExpiryFilter</filter-name>
    <url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>ExpiryFilter</filter-name>
    <url-pattern>*.css</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>ExpiryFilter</filter-name>
    <url-pattern>*.js</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>ExpiryFilter</filter-name>
    <url-pattern>*.gif</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>ExpiryFilter</filter-name>
    <url-pattern>*.png</url-pattern>
</filter-mapping>

<filter>
    <filter-name>GZIPFilter</filter-name>
    <filter-class>com.db.gm.adk.server.filter.GZIPFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>GZIPFilter</filter-name>
    <url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>GZIPFilter</filter-name>
    <url-pattern>*.css</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>GZIPFilter</filter-name>
    <url-pattern>*.js</url-pattern>
</filter-mapping>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping> 

<filter>
    <filter-name>NoCacheFilter</filter-name>
    <filter-class>com.db.gbs.gbsapps.rds.backend.servlet.filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>NoCacheFilter</filter-name>
    <url-pattern>/index.html</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>spring-rpc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>spring-rpc</servlet-name>
    <url-pattern>*.rpc</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>eventServiceImpl</servlet-name>
    <servlet-class>de.novanic.eventservice.service.EventServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>eventServiceImpl</servlet-name>
    <url-pattern>/main/gwteventservice</url-pattern>
</servlet-mapping>

<error-page>
    <error-code>500</error-code>
    <location>/WEB-INF/jsp/error.jsp</location>
</error-page>

<error-page>
    <error-code>503</error-code>
    <location>/WEB-INF/jsp/error.jsp</location>
</error-page>

<error-page>
    <error-code>403</error-code>
    <location>/WEB-INF/jsp/403.jsp</location>
</error-page>

<error-page>
    <error-code>404</error-code>
    <location>/WEB-INF/jsp/404.jsp</location>
</error-page>

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/WEB-INF/jsp/error.jsp</location>
</error-page>

提前感谢您的建议。

【问题讨论】:

    标签: java spring spring-mvc gwt


    【解决方案1】:

    很可能是您使用的后缀“.rpc”有问题

    尝试不使用“.rpc”进行映射

    查看弹簧参考

    http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-ann-requestmapping-suffix-pattern-match

    按后缀匹配路径模式

    默认情况下,Spring MVC 自动执行“.”后缀模式匹配,以便映射到 /person 的控制器也隐式映射到 /person。。这允许通过文件扩展名指示内容类型,例如/person.pdf、/person.xml 等。然而,一个常见的缺陷是映射的最后一个路径段是 URI 变量,例如/人/{id}。虽然对 /person/1.json 的请求会正确地导致路径变量 id=1 和扩展名“.json”,但当 id 自然包含一个点时,例如/person/joe@email.com 结果与预期不符。显然这里的“.com”不是文件扩展名。

    解决这个问题的正确方法是将 Spring MVC 配置为仅针对为内容协商目的而注册的文件扩展名进行后缀模式匹配。有关这方面的更多信息,请先参阅第 17.16.4 节,“内容协商”,然后参阅第 17.16.9 节,“路径匹配”,展示如何启用后缀模式匹配以及如何仅使用已注册的后缀模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 2011-06-11
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多