Issue Details (XML | Word | Printable)

Key: GRAILSPLUGINS-443
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Blocker Blocker
Assignee: Peter Ledbrook
Reporter: Erik Pragt
Votes: 0
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
Grails Plugins

Remoting: HTTPInvoker throws ClassNotFoundException on incoming POJO's

Created: 10/Jul/08 04:26 AM   Updated: 11/Sep/08 03:55 PM   Resolved: 11/Sep/08 09:20 AM
Return to search
Component/s: Grails-Remoting
Affects Version/s: None
Fix Version/s: Grails-Remoting 1.0

Time Tracking:
Not Specified

File Attachments: 1. Text File GRAILS-443.patch (0.5 kB)
2. Zip Archive trunk.zip (5.94 MB)


Testcase included: yes


 Description  « Hide

I have an remote service (ProjectService) which looks (somewhat) like this:

import com.domain.Project

interface ProjectService { Project get(Long id) void store(Project project) }

When using httpinvoker, the first request works. I supply the id, and the
Project nicely gets transfered. However, when I to use the store method, the
transfer fails, and I get a ClassNotFoundException:
org.springframework.web.util.NestedServletException: Class not found during
deserialization; nested exception is java.lang.ClassNotFoundException:
com.domain.Project.

the complete stacktrace looks like this:.

[72985] errors.GrailsExceptionResolver Class not found during
deserialization; nested exception is java.lang.ClassNotFoundException:
com.domain.Project
org.springframework.web.util.NestedServletException: Class not found during
deserialization; nested exception is java.lang.ClassNotFoundException:
com.domain.Project
at
org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest(HttpInvokerServiceExporter.java:78)
at
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)
at
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
at
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
at
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
at
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1098)
at
org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.processFilterChain(UrlMappingsFilter.java:157)
at
org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal(UrlMappingsFilter.java:148)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)
at
org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.parsePage(GrailsPageFilter.java:123)
at
org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter(GrailsPageFilter.java:86)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)
at
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:65)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)
at
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236)
at
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1089)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:365)
at
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at org.mortbay.jetty.Server.handle(Server.java:295)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:503)
at
org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:841)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:639)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:210)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:379)
at
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:361)
at
org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
Caused by: java.lang.ClassNotFoundException: com.domain.Project
at org.codehaus.groovy.tools.RootLoader.findClass(RootLoader.java:146)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at org.codehaus.groovy.tools.RootLoader.loadClass(RootLoader.java:118)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:242)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:585)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1544)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1634)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1908)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1832)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)



Peter Ledbrook made changes - 10/Jul/08 04:30 AM
Field Original Value New Value
Affects Version/s 1.0.3 [ 14124 ]
Component/s Plugins [ 12182 ]
Component/s Grails-Remoting [ 12756 ]
Key GRAILS-3224 GRAILSPLUGINS-443
Project Grails [ 11063 ] Grails Plugins [ 11450 ]
Peter Ledbrook made changes - 10/Jul/08 04:30 AM
Assignee Graeme Rocher [ graemerocher ] Peter Ledbrook [ pledbrook ]
Peter Ledbrook added a comment - 17/Jul/08 04:40 AM

I can't run the client due to unsatisfied dependencies:

  • org.apache.cxf:cxf:jar:2.1.1
  • com.xebia.scrum:scrum-services:jar:0.1-SNAPSHOT
  • com.xebia.scrum:scrum-domain:jar:0.1-SNAPSHOT

Peter Ledbrook added a comment - 17/Jul/08 06:46 AM

OK, I got this working. I think the problem is that the wrong class loader is being used to deserialise the Project instance. The domain class is actually in the context class loader, whereas the deserialiser is using the class loader that loaded the remoting servlet. This isn't going to be easy to fix, and I don't have much time to look into it.


Peter Ledbrook added a comment - 17/Jul/08 07:42 AM

Great, it looks like this works with Spring 2.5.5. Your best bet may be to drop spring 2.5.5 JAR into your Grails 1.0.3 distribution and apply the attached patch to your copy of the remoting plugin.


Peter Ledbrook made changes - 17/Jul/08 07:43 AM
Attachment GRAILS-443.patch [ 35910 ]
Erik Pragt added a comment - 08/Aug/08 03:18 AM

Peter,

You're the best. I finally had time to continue on this project, and your patch + upgrading to Spring 2.5.5 fixed this issue!

Thanks again,

Erik


Peter Ledbrook added a comment - 11/Sep/08 09:20 AM

I have fixed the plugin. It just needs to be used with Spring 2.5.5, which will hopefully go into Grails 1.0.4.


Peter Ledbrook made changes - 11/Sep/08 09:20 AM
Resolution Fixed [ 1 ]
Fix Version/s Grails-Remoting 1.0 [ 14563 ]
Status Open [ 1 ] Resolved [ 5 ]
Erik Pragt added a comment - 11/Sep/08 03:55 PM

Great work! If Grails will use Spring 2.5.5, you can close this one too: http://jira.codehaus.org/browse/GRAILS-3213