Remoting Plugin

Remoting: HTTPInvoker throws ClassNotFoundException on incoming POJO's

Details

  • Type: Bug Bug
  • Status: Resolved Resolved
  • Priority: Blocker Blocker
  • Resolution: Fixed
  • Affects Version/s: None
  • Fix Version/s: 1.0
  • Component/s: None
  • Labels:
    None
  • Testcase included:
    yes

Description

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)

  1. GRAILS-443.patch
    17/Jul/08 7:43 AM
    0.5 kB
    Peter Ledbrook

Activity

Hide
Peter Ledbrook added a comment -

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
Show
Peter Ledbrook added a comment - 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
Hide
Peter Ledbrook added a comment -

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.

Show
Peter Ledbrook added a comment - 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.
Hide
Peter Ledbrook added a comment -

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.

Show
Peter Ledbrook added a comment - 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.
Hide
Erik Pragt added a comment -

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

Show
Erik Pragt added a comment - 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
Hide
Peter Ledbrook added a comment -

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.

Show
Peter Ledbrook added a comment - 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.
Hide
Erik Pragt added a comment -

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

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

People

Vote (0)
Watch (1)

Dates

  • Created:
    Updated:
    Resolved: