[ 
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>
> --------------------------------------
> [33299...@qtp-22864463-1] 2009-05-22 11:29:06,296 DEBUG 
> nl.knowledgeplaza.profiler.services.UserServiceImpl.list(UserServiceImpl.java:48)
>  list User
> [EL Fine]: 2009-05-22 
> 11:29:07.093--ServerSession(15545028)--Connection(13749345)--Thread(thread[33299...@qtp-22864463-1,5,main])--SELECT
>  id, username, middlename, email, lastname, callname, firstname, version FROM 
> KP_USER
> [33299...@qtp-22864463-1] 2009-05-22 11:29:08,750 DEBUG 
> nl.knowledgeplaza.profiler.services.UserServiceImpl.list(UserServiceImpl.java:52)
>  list User size=4
> May 22, 2009 11:29:11 AM org.apache.cxf.phase.PhaseInterceptorChain 
> doIntercept
> INFO: Interceptor has thrown exception, unwinding now
> org.apache.cxf.interceptor.Fault: Marshalling Error: class 
> nl.knowledgeplaza.profiler.services.support.Users nor any of its super class 
> is known to this context.
>       at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:159)
>       at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:169)
>       at 
> org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:105)
>       at 
> org.apache.cxf.interceptor.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)
>       at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
>       at 
> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:74)
>       at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
>       at 
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:89)
>       at 
> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:302)
>       at 
> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:265)
>       at 
> org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:70)
>       at 
> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
>       at 
> org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
>       at 
> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
>       at org.mortbay.jetty.Server.handle(Server.java:324)
>       at 
> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:535)
>       at 
> org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:880)
>       at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:747)
>       at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
>       at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
>       at 
> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
>       at 
> org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:520)
> Caused by: javax.xml.bind.MarshalException
>  - with linked exception:
> [javax.xml.bind.JAXBException: class 
> nl.knowledgeplaza.profiler.services.support.Users nor any of its super class 
> is known to this context.]
>       at 
> com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:328)
>       at 
> com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:254)
>       at 
> javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75)
>       at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:441)
>       at 
> org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:138)
>       ... 21 more
> Caused by: javax.xml.bind.JAXBException: class 
> nl.knowledgeplaza.profiler.services.support.Users nor any of its super class 
> is known to this context.
>       at 
> com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:242)
>       at 
> com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:257)
>       at 
> com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:649)
>       at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:151)
>       at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:185)
>       at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:305)
>       at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:312)
>       at 
> com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:71)
>       at 
> com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:490)
>       at 
> com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:325)
>       ... 25 more
> Caused by: javax.xml.bind.JAXBException: class 
> nl.knowledgeplaza.profiler.services.support.Users nor any of its super class 
> is known to this context.
>       at 
> com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:566)
>       at 
> com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:644)
>       ... 32 more
> May 22, 2009 11:29:12 AM org.apache.cxf.interceptor.LoggingInInterceptor 
> logging
> INFO: Inbound Message
> ----------------------------
> ID: 2
> Encoding: UTF-8
> Content-Type: text/xml; charset=utf-8
> Headers: {content-type=[text/xml; charset=utf-8], Content-Length=[415], 
> Server=[Jetty(6.1.15)]}
> Payload: <soap:Envelope 
> xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";><soap:Body><ns1:listResponse
>  
> xmlns:ns1="http://services.profiler.knowledgeplaza.nl/";><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Marshalling
>  Error: class nl.knowledgeplaza.profiler.services.support.Users nor any of 
> its super class is known to this 
> context.</faultstring></soap:Fault></ns1:listResponse></soap:Body></soap:Envelope>
> --------------------------------------
> The Users class is just a collection workaround as suggested in CXF's 
> documentation:
> @XmlRootElement(name = "users")
> public class Users 
> implements Serializable
> {
>       public Users() { setUser(new ArrayList<User>()); } // upon JAXB 
> unmarshalling of an empty collection, the setUser is NOT called and the 
> collection would be null instead of empty
>       public Users(Collection<User> c) { setUser(c); }
>       
>       private Collection<User> iCollection;
>       public Collection<User> getUser() { return iCollection; }
>       public void setUser(Collection<User> c) { iCollection = c; }
>     
>       public List<User> asList() { return new ArrayList<User>(iCollection); }
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to