cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tom (JIRA)" <j...@apache.org>
Subject [jira] Commented: (CXF-2234) Unmarshalling with JAXB of a method that is defined in an inherited interface results in an NPE exception
Date Fri, 22 May 2009 09:48:45 GMT

    [ 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>
> --------------------------------------
> [33299971@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[33299971@qtp-22864463-1,5,main])--SELECT
id, username, middlename, email, lastname, callname, firstname, version FROM KP_USER
> [33299971@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.


Mime
View raw message