You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Tom (JIRA)" <ji...@apache.org> on 2009/05/22 11:42:45 UTC

[jira] Created: (CXF-2234) Unmarshalling with JAXB of a method that is defined in an inherited interface results in an NPE exception

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
    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.


[jira] Commented: (CXF-2234) Unmarshalling with JAXB of a method that is defined in an inherited interface results in an NPE exception

Posted by "Tom (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2234?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12712106#action_12712106 ] 

Tom commented on CXF-2234:
--------------------------

I attached the source, but it's a "what's the most efficient approach" thingy. My classes are relating to all kind of other things like FEST reflection. I believe it would be much more efficient to take an existing "list" alike method using JAXB, and simply move that into a inherited interface. If you then get the same exception, you won't have to work through my sources, nor do I need to shop out a working example. If not, then we can see if I should sharpen my axe.

The sniplets wee there to explain the setup, but you should mimick it in an existing unit test.


> 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
>         Attachments: services.rar
>
>
> 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.


[jira] Updated: (CXF-2234) Unmarshalling with JAXB of a method that is defined in an inherited interface results in an NPE exception

Posted by "Tom (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/CXF-2234?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Tom updated CXF-2234:
---------------------

    Component/s: Soap Binding

> 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.


[jira] Closed: (CXF-2234) Unmarshalling with JAXB of a method that is defined in an inherited interface results in an NPE exception

Posted by "Daniel Kulp (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/CXF-2234?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Daniel Kulp closed CXF-2234.
----------------------------

       Resolution: Fixed
    Fix Version/s: 2.2.2

User reports it's fixed or no longer occuring.  

> 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
>             Fix For: 2.2.2
>
>         Attachments: services.rar
>
>
> 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.


[jira] Updated: (CXF-2234) Unmarshalling with JAXB of a method that is defined in an inherited interface results in an NPE exception

Posted by "Tom (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/CXF-2234?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Tom updated CXF-2234:
---------------------

    Attachment: services.rar

The source classes. But they are mixed in with all kinds of other libraries, like FEST reflection.

> 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
>         Attachments: services.rar
>
>
> 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.


[jira] Updated: (CXF-2234) Unmarshalling with JAXB of a method that is defined in an inherited interface results in an NPE exception

Posted by "Tom (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/CXF-2234?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Tom updated CXF-2234:
---------------------

    Description: 
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); }
}

  was:
The UserService:

[code]
@javax.jws.WebService
public interface UserService extends AbstractService<User, Users>
{
}
[/code]

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); }
}


> 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
>    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.


[jira] Commented: (CXF-2234) Unmarshalling with JAXB of a method that is defined in an inherited interface results in an NPE exception

Posted by "Tom (JIRA)" <ji...@apache.org>.
    [ 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.


[jira] Updated: (CXF-2234) Unmarshalling with JAXB of a method that is defined in an inherited interface results in an NPE exception

Posted by "Tom (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/jira/browse/CXF-2234?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Tom updated CXF-2234:
---------------------

    Description: 
The UserService:

[code]
@javax.jws.WebService
public interface UserService extends AbstractService<User, Users>
{
}
[/code]

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); }
}

  was:
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); }
}


> 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
>    Affects Versions: 2.2.2
>         Environment: WindowsXP-SP3, Eclipse 3.4
>            Reporter: Tom
>
> The UserService:
> [code]
> @javax.jws.WebService
> public interface UserService extends AbstractService<User, Users>
> {
> }
> [/code]
> 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.


[jira] Commented: (CXF-2234) Unmarshalling with JAXB of a method that is defined in an inherited interface results in an NPE exception

Posted by "Tom (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2234?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12720086#action_12720086 ] 

Tom commented on CXF-2234:
--------------------------

I just upgraded to 2.2.2 and the exception is gone. So. Ehm. Ok, close it?

> 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
>         Attachments: services.rar
>
>
> 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.


[jira] Commented: (CXF-2234) Unmarshalling with JAXB of a method that is defined in an inherited interface results in an NPE exception

Posted by "Daniel Kulp (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2234?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12716717#action_12716717 ] 

Daniel Kulp commented on CXF-2234:
----------------------------------


You can PROBABLY get around this by adding an @XmlSeeAlso annotation pointing at the Users class to the service interfaces.   JAXB SHOULD then be able to pick it up.



> 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
>         Attachments: services.rar
>
>
> 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.


[jira] Commented: (CXF-2234) Unmarshalling with JAXB of a method that is defined in an inherited interface results in an NPE exception

Posted by "Daniel Kulp (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/jira/browse/CXF-2234?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12712096#action_12712096 ] 

Daniel Kulp commented on CXF-2234:
----------------------------------



Any chance you could package this up into an example project and attach it?

> 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.