[ https://issues.apache.org/jira/browse/CXF-2234?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12712006#action_12712006 ]
Tom commented on CXF-2234: -------------------------- Oh, the same method is also called through REST (but I removed the corresponding annotations from the sniplets) and there it works ok. If the list method is placed in the UserService interface instead of the inherited interface, the unittest also runs correctly. Both point above suggest to me that the problem is infact not a JAXB problem, but a SOAP-using-JAXB problem. > Unmarshalling with JAXB of a method that is defined in an inherited interface > results in an NPE exception > --------------------------------------------------------------------------------------------------------- > > Key: CXF-2234 > URL: https://issues.apache.org/jira/browse/CXF-2234 > Project: CXF > Issue Type: Bug > Components: JAXB Databinding, Soap Binding > Affects Versions: 2.2.2 > Environment: WindowsXP-SP3, Eclipse 3.4 > Reporter: Tom > > The UserService: > @javax.jws.WebService > public interface UserService extends AbstractService<User, Users> > { > } > The AbstractService: > @javax.jws.WebService > public interface AbstractService<T, Ts> > { > public Ts list(); > } > The UserServiceImpl: > @javax.jws.WebService(endpointInterface = > "nl.knowledgeplaza.profiler.services.UserService", serviceName = "users") // > the "ws" prefix is handled by the container > public class UserServiceImpl > implements UserService > { > public Users list() > { > try > { > if (slf4j.isDebugEnabled()) slf4j.debug("list User"); > > // find all > List<User> lList = User.findAll(); > if (slf4j.isDebugEnabled()) slf4j.debug("list User > size={}", lList.size()); > > // create a collection so JAXB knows what to do > Users lUsers= new Users(lList); > > // done > return lUsers; > } > catch (RuntimeException e) > { > slf4j.error(ExceptionUtil.describe(e), e); > throw e; > } > } > } > UnitTests start the SOAP end point as follows: > javax.xml.ws.Endpoint.publish(cWSUserAddress, new UserServiceImpl()); > The unittest: > @org.junit.Test > public void listUsersSOAP() > { > // create a proxy to the service > JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); > factory.getInInterceptors().add(new LoggingInInterceptor()); > factory.getOutInterceptors().add(new LoggingOutInterceptor()); > factory.setServiceClass(UserService.class); > factory.setAddress(cWSUserAddress); > UserService lUserService = (UserService)factory.create(); > > // make the call > Users lUsers = lUserService.list(); > > // check it > org.fest.assertions.Assertions.assertThat( > lUsers.getUser().size() ).isGreaterThan(0); > } > The call arrives serverside, the code is correctly executed and 4 User > entities have been fetched from the database. The JAXB marshalling then runs > into problems, resulting in a value of null being returned on the clients > side, and failing the unittest on a NPE. > The trace: > May 22, 2009 11:29:00 AM > org.apache.cxf.interceptor.LoggingOutInterceptor$LoggingCallback onClose > INFO: Outbound Message > --------------------------- > ID: 2 > Address: http://localhost:9000/ws/user > Encoding: UTF-8 > Content-Type: text/xml > Headers: {SOAPAction=[""], Accept=[*/*]} > Payload: <soap:Envelope > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:list > xmlns:ns1="http://services.profiler.knowledgeplaza.nl/" > /></soap:Body></soap:Envelope> > -------------------------------------- > [33299...@qtp-22864463-1] 2009-05-22 11:29:06,296 DEBUG > nl.knowledgeplaza.profiler.services.UserServiceImpl.list(UserServiceImpl.java:48) > list User > [EL Fine]: 2009-05-22 > 11:29:07.093--ServerSession(15545028)--Connection(13749345)--Thread(thread[33299...@qtp-22864463-1,5,main])--SELECT > id, username, middlename, email, lastname, callname, firstname, version FROM > KP_USER > [33299...@qtp-22864463-1] 2009-05-22 11:29:08,750 DEBUG > nl.knowledgeplaza.profiler.services.UserServiceImpl.list(UserServiceImpl.java:52) > list User size=4 > May 22, 2009 11:29:11 AM org.apache.cxf.phase.PhaseInterceptorChain > doIntercept > INFO: Interceptor has thrown exception, unwinding now > org.apache.cxf.interceptor.Fault: Marshalling Error: class > nl.knowledgeplaza.profiler.services.support.Users nor any of its super class > is known to this context. > at > org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:159) > at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:169) > at > org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:105) > at > org.apache.cxf.interceptor.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68) > at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236) > at > org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:74) > at > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236) > at > org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:89) > at > org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:302) > at > org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:265) > at > org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:70) > at > org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) > at > org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) > at > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) > at org.mortbay.jetty.Server.handle(Server.java:324) > at > org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:535) > at > org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:880) > at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:747) > at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) > at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) > at > org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) > at > org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:520) > Caused by: javax.xml.bind.MarshalException > - with linked exception: > [javax.xml.bind.JAXBException: class > nl.knowledgeplaza.profiler.services.support.Users nor any of its super class > is known to this context.] > at > com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:328) > at > com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:254) > at > javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75) > at > org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:441) > at > org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:138) > ... 21 more > Caused by: javax.xml.bind.JAXBException: class > nl.knowledgeplaza.profiler.services.support.Users nor any of its super class > is known to this context. > at > com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:242) > at > com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:257) > at > com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:649) > at > com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:151) > at > com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:185) > at > com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:305) > at > com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:312) > at > com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:71) > at > com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:490) > at > com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:325) > ... 25 more > Caused by: javax.xml.bind.JAXBException: class > nl.knowledgeplaza.profiler.services.support.Users nor any of its super class > is known to this context. > at > com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:566) > at > com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:644) > ... 32 more > May 22, 2009 11:29:12 AM org.apache.cxf.interceptor.LoggingInInterceptor > logging > INFO: Inbound Message > ---------------------------- > ID: 2 > Encoding: UTF-8 > Content-Type: text/xml; charset=utf-8 > Headers: {content-type=[text/xml; charset=utf-8], Content-Length=[415], > Server=[Jetty(6.1.15)]} > Payload: <soap:Envelope > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:listResponse > > xmlns:ns1="http://services.profiler.knowledgeplaza.nl/"><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Marshalling > Error: class nl.knowledgeplaza.profiler.services.support.Users nor any of > its super class is known to this > context.</faultstring></soap:Fault></ns1:listResponse></soap:Body></soap:Envelope> > -------------------------------------- > The Users class is just a collection workaround as suggested in CXF's > documentation: > @XmlRootElement(name = "users") > public class Users > implements Serializable > { > public Users() { setUser(new ArrayList<User>()); } // upon JAXB > unmarshalling of an empty collection, the setUser is NOT called and the > collection would be null instead of empty > public Users(Collection<User> c) { setUser(c); } > > private Collection<User> iCollection; > public Collection<User> getUser() { return iCollection; } > public void setUser(Collection<User> c) { iCollection = c; } > > public List<User> asList() { return new ArrayList<User>(iCollection); } > } -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.