3

I have a Grails backend with a Flex Single Page Application acting as the UI. For some reason, when I make an AMF request, my app conks out. with the following error (parts truncated for readability)

2014-04-20 21:07:55,572 [http-bio-8080-exec-6] ERROR errors.GrailsExceptionResolver  -      
ClassCastException occurred when processing request: [POST]   
/OrlandoGrails/messagebroker/amf
org.springframework.web.context.request.ServletRequestAttributes cannot be cast to 
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest. Stacktrace follows:
java.lang.ClassCastException:   
org.springframework.web.context.request.ServletRequestAttributes cannot be cast to 
 org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest...
2014-04-20 21:07:55,573 [http-bio-8080-exec-6] ERROR errors.GrailsExceptionResolver  - 

Unable to render errors view: 
org.springframework.web.context.request.ServletRequestAttributes cannot be cast to 
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest...
java.lang.ClassCastException: 
org.springframework.web.context.request.ServletRequestAttributes cannot be cast to 
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
Servlet.service() for servlet [Spring MVC Dispatcher Servlet] in context with path 
[/OrlandoGrails] threw exception [Request processing failed; nested exception is 
org.codehaus.groovy.grails.exceptions.GrailsRuntimeException: 

java.lang.ClassCastException: 
org.springframework.web.context.request.ServletRequestAttributes cannot be cast to 
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest] with root cause...
java.lang.ClassCastException: 
org.springframework.web.context.request.ServletRequestAttributes cannot be cast to 
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest at 
 grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53

I've read some of the other solutions on the web, and they say that I have to order my web.xml with my springSecurityFilter first and it's mapping last. I have done that, and below is my web.xml template (before Grails gets ahold of it)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
     metadata-complete="true"
     xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<display-name>/@grails.project.key@</display-name>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>@grails.project.key@</param-value>
</context-param>

<listener>
    <listener-class>org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener</listener-class>
</listener>

<filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter</filter-class>
</filter>
<filter>
    <filter-name>charEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetBeanName</param-name>
        <param-value>characterEncodingFilter</param-value>
    </init-param>
    <init-param>
        <param-name>targetFilterLifecycle</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>charEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>


<servlet>
    <servlet-name>grails</servlet-name>
    <servlet-class>org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet</servlet-class>
    <init-param>
        <param-name>dispatchOptionsRequest</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
</servlet>
<servlet>
    <servlet-name>gsp</servlet-name>
    <servlet-class>org.codehaus.groovy.grails.web.pages.GroovyPagesServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>gsp</servlet-name>
    <url-pattern>*.gsp</url-pattern>
</servlet-mapping>

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.gsp</welcome-file>
</welcome-file-list>

<listener>
    <listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
<servlet>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/web-application-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>

The url that is being accessed is /blah/messagebroker/amf, so I would have thought that only the blazeds messagebroker handler would get ahold of the request, but clearly I am wrong.

Any help on this is greatly appreciated.

dmahapatro
  • 49,365
  • 7
  • 88
  • 117
Black Dynamite
  • 4,067
  • 5
  • 40
  • 75
  • Seems a bit odd that flex.messaging.MessageBrokerServlet is missing from your configuration. I'm not a Flex expert at all but I seem to recall you need a listener and the Servlet both within your Tomcat application. Similar to this: http://svn.codehaus.org/gfs/trunk/grails-flex-scaffold/trunk/FlexScaffoldGrailsPlugin.groovy or in XML version: http://www.pavlasek.sk/devel/?p=39 – Joshua Moore Apr 25 '14 at 12:55
  • Have you tried the advice in the answer to this question: http://stackoverflow.com/questions/8146498/the-correct-order-of-filters-in-web-xml-for-a-grails-application ? – Saïd May 01 '14 at 09:28

1 Answers1

0

Due to the document ordering in the web.xml, charEncodingFilter will always be executed before the sitemesh filter.

I'm speculating, but it seems that the ServletRequestAttribute instance created by charEncodingFilter is being cast to the wrong type when the sitemesh filter is executed.

Have you tried swapping the positions of the filter-mappings? Something like:

<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
<filter-mapping>
    <filter-name>charEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
Saïd
  • 8,780
  • 1
  • 28
  • 28