2011-05-10 49 views
3

我正在使用OpenSessionInView和DWR为我的ajax请求获取一个hibernate会话。当我通过部署战争开始这工作得很好,但是当我尝试使用run-app跑,我得到以下错误:OpenSessionInView过滤器会导致grails run-app炸弹?

ERROR: org.apache.catalina.startup.ContextConfig - Parse error in application web.xml file at file:/C:/Users/stefan/.grails/1.3.6/projects/myproject/resources/web.xml java.lang.IllegalArgumentException: Filter mapping specifies an unknown filter name hiddenHttpMethod

的web.xml

<filter> 
    <filter-name>hibernateFilter</filter-name> 
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
    <init-param> 
     <param-name>singleSession</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>hibernateFilter</filter-name> 
    <url-pattern>/dwr/*</url-pattern> 
</filter-mapping> 

我尝试添加过滤器映射的hiddenHttpMethod,但我得到相同的错误。这是怎么回事?

添加的条目,其失败:

<filter> 
     <filter-name>hiddenHttpMethod</filter-name> 
     <filter-class>org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>hiddenHttpMethod</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>FORWARD</dispatcher> 
     <dispatcher>REQUEST</dispatcher> 
    </filter-mapping> 

回答

2

很奇怪,但需要多个web.xml条目添加到文件的顶部,作为过滤器的顺序很重要。

添加这附近,过滤器的顶部:

<filter> 
     <filter-name>hiddenHttpMethod</filter-name> 
     <filter-class>org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>hiddenHttpMethod</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>FORWARD</dispatcher> 
     <dispatcher>REQUEST</dispatcher> 
    </filter-mapping> 

    <filter> 
     <filter-name>reloadFilter</filter-name> 
     <filter-class>org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>reloadFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>FORWARD</dispatcher> 
     <dispatcher>REQUEST</dispatcher> 
    </filter-mapping> 

但是请注意,这增加了reloadFilter到生产战争。你可以通过拦截webXml事件来消除这种情况,但这很痛苦。