You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Olivier <ol...@mutantzoo.com> on 2008/05/19 07:44:17 UTC
JAX-RS (JSR 311) Sub Resource NullPointerException
All,
I have implemented a set of basic classes in order to test the use of
JAX-RS sub resources and found a NullPointerException (see end of
message for stack trace).
I am getting the CXF 2.1 version from the maven repository.
In my example, I have 2 methods:
hello
hello2
hello2 is a resource method marked with a @GET and a @PATH
hello is a sub resource method without a @GET but with a @PATH
Both methods return an Helloe object. A call to hello2 via a browser
(http://localhost:9095/mzt-services/services/HelloRest/helloservice/hello2/toto)
works fine and returns something like:
<helloe>
<age>10</age>
<name>toto</name>
</helloe>
The call to hello via a browser
(http://localhost:9095/mzt-services/services/HelloRest/helloservice/hello/toto/age)
returns the following: (exception is pasted at the end)
<ns1:XMLFault>
<ns1:faultstring>java.lang.NullPointerException</ns1:faultstring>
</ns1:XMLFault>
The code for the Root Resource (the REST service is):
@Path("helloservice")
public class HelloServiceImpl implements HelloService
{
@Path("hello/{name}")
public Helloe hello(@PathParam("name")
String name)
{
Helloe helloe = new HelloeImpl();
// Hardcode values
helloe.setName(name);
helloe.setAge(10);
return helloe;
}
@GET
@Path("hello2/{name}")
public Helloe hello2(@PathParam("name")
String name)
{
Helloe helloe = new HelloeImpl();
// Hardcode values
helloe.setName(name);
helloe.setAge(10);
return helloe;
//return "<name>" + name + "</name>";
}
}
The code for the HelloeImpl class is:
@XmlRootElement(name = "helloe")
public class HelloeImpl implements Helloe
{
private String name;
private int age;
public HelloeImpl() {
// TODO Auto-generated constructor stub
}
@GET
@Path("/name")
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@GET
@Path("/age")
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
}
Exception:
=======
May 18, 2008 10:23:23 PM
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor han
dleMessage
INFO: Found operation: hello
May 18, 2008 10:23:23 PM org.apache.cxf.phase.PhaseInterceptorChain
doIntercept
INFO: Interceptor has thrown exception, unwinding now
java.lang.NullPointerException
at
org.apache.cxf.jaxrs.JAXRSUtils.findTargetMethod(JAXRSUtils.java:237)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:139)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:53)
at
org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInv
okerInterceptor.java:56)
at
org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecu
tor.java:37)
at
org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(Se
rviceInvokerInterceptor.java:92)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseIntercept
orChain.java:221)
at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainIniti
ationObserver.java:78)
at
org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDes
tination.java:92)
at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(
ServletController.java:214)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletCont
roller.java:113)
at
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCX
FServlet.java:170)
at
org.apache.cxf.transport.servlet.AbstractCXFServlet.doGet(AbstractCXF
Servlet.java:152)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:442
)
at
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:3
57)
at
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:2
26)
at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:6
15)
at
org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHand
lerCollection.java:150)
at
org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.
java:123)
at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:1
41)
at org.mortbay.jetty.Server.handle(Server.java:272)
at
org.mortbay.jetty.HttpConnection.handlerRequest(HttpConnection.java:3
96)
at
org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpCo
nnection.java:652)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:488)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:198)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:311)
at
org.mortbay.jetty.nio.HttpChannelEndPoint.run(HttpChannelEndPoint.jav
a:270)
at
org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool
.java:475
Re: JAX-RS (JSR 311) Sub Resource NullPointerException
Posted by Olivier <ol...@mutantzoo.com>.
Sergey,
Thanks, returning the Impl worked fine. Any plan to support this in the
future?
Olivier
Sergey Beryozkin wrote:
> Hi
>
> Looks lile what is causing the issue is that in hello() method a
> sub-resource, at the introspection time, is an interface.
> I'm not sure yet if it's allowed by JAX-RS, probably yes...
>
> Try to move
>
>> @GET
>> @Path("/age")
>
> annotations from the HelloeImpl.getAge() to the corresponding
> interface method for a start. It may not fix the problem initially as
> the runtime currently expects that a method to be invoked actually
> belongs to the implementation class (except for AOP cases where
> it actually will work fine)... Possibly a minor fix would need to be
> applied to handle this scenario too.
> As a temporarily workaround please return HelloeImpl in a hello()
> signature and it will work...
>
> Cheers, Sergey
>
> ----- Original Message ----- From: "Olivier" <ol...@mutantzoo.com>
> To: <us...@cxf.apache.org>
> Sent: Monday, May 19, 2008 6:44 AM
> Subject: JAX-RS (JSR 311) Sub Resource NullPointerException
>
>
>> All,
>>
>> I have implemented a set of basic classes in order to test the use of
>> JAX-RS sub resources and found a NullPointerException (see
>> end of message for stack trace).
>> I am getting the CXF 2.1 version from the maven repository.
>>
>> In my example, I have 2 methods:
>>
>> hello
>> hello2
>>
>> hello2 is a resource method marked with a @GET and a @PATH
>> hello is a sub resource method without a @GET but with a @PATH
>>
>> Both methods return an Helloe object. A call to hello2 via a browser
>> (http://localhost:9095/mzt-services/services/HelloRest/helloservice/hello2/toto)
>> works fine and returns something like:
>>
>> <helloe>
>> <age>10</age>
>> <name>toto</name>
>> </helloe>
>>
>> The call to hello via a browser
>> (http://localhost:9095/mzt-services/services/HelloRest/helloservice/hello/toto/age)
>> returns the
>> following: (exception is pasted at the end)
>>
>> <ns1:XMLFault>
>> <ns1:faultstring>java.lang.NullPointerException</ns1:faultstring>
>> </ns1:XMLFault>
>>
>> The code for the Root Resource (the REST service is):
>>
>> @Path("helloservice")
>> public class HelloServiceImpl implements HelloService
>> {
>> @Path("hello/{name}")
>> public Helloe hello(@PathParam("name")
>> String name)
>> {
>> Helloe helloe = new HelloeImpl();
>> // Hardcode values
>> helloe.setName(name);
>> helloe.setAge(10);
>> return helloe;
>> }
>>
>> @GET
>> @Path("hello2/{name}")
>> public Helloe hello2(@PathParam("name")
>> String name)
>> {
>> Helloe helloe = new HelloeImpl();
>> // Hardcode values
>> helloe.setName(name);
>> helloe.setAge(10);
>> return helloe;
>> //return "<name>" + name + "</name>";
>> }
>> }
>>
>> The code for the HelloeImpl class is:
>>
>> @XmlRootElement(name = "helloe")
>> public class HelloeImpl implements Helloe
>> {
>> private String name;
>>
>> private int age;
>>
>> public HelloeImpl() {
>> // TODO Auto-generated constructor stub
>> }
>>
>> @GET
>> @Path("/name")
>> public String getName()
>> {
>> return name;
>> }
>>
>> public void setName(String name)
>> {
>> this.name = name;
>> }
>>
>> @GET
>> @Path("/age")
>> public int getAge()
>> {
>> return age;
>> }
>>
>> public void setAge(int age)
>> {
>> this.age = age;
>> }
>> }
>>
>> Exception:
>> =======
>>
>> May 18, 2008 10:23:23 PM
>> org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor han
>> dleMessage
>> INFO: Found operation: hello
>> May 18, 2008 10:23:23 PM org.apache.cxf.phase.PhaseInterceptorChain
>> doIntercept
>> INFO: Interceptor has thrown exception, unwinding now
>> java.lang.NullPointerException
>> at
>> org.apache.cxf.jaxrs.JAXRSUtils.findTargetMethod(JAXRSUtils.java:237)
>>
>> at
>> org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:139)
>> at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:53)
>> at
>> org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInv
>> okerInterceptor.java:56)
>> at
>> org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecu
>> tor.java:37)
>> at
>> org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(Se
>> rviceInvokerInterceptor.java:92)
>> at
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseIntercept
>> orChain.java:221)
>> at
>> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainIniti
>> ationObserver.java:78)
>> at
>> org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDes
>> tination.java:92)
>> at
>> org.apache.cxf.transport.servlet.ServletController.invokeDestination(
>> ServletController.java:214)
>> at
>> org.apache.cxf.transport.servlet.ServletController.invoke(ServletCont
>> roller.java:113)
>> at
>> org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCX
>> FServlet.java:170)
>> at
>> org.apache.cxf.transport.servlet.AbstractCXFServlet.doGet(AbstractCXF
>> Servlet.java:152)
>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
>> at
>> org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:442
>> )
>> at
>> org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:3
>> 57)
>> at
>> org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:2
>> 26)
>> at
>> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:6
>> 15)
>> at
>> org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHand
>> lerCollection.java:150)
>> at
>> org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.
>> java:123)
>> at
>> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:1
>> 41)
>> at org.mortbay.jetty.Server.handle(Server.java:272)
>> at
>> org.mortbay.jetty.HttpConnection.handlerRequest(HttpConnection.java:3
>> 96)
>> at
>> org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpCo
>> nnection.java:652)
>> at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:488)
>> at
>> org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:198)
>> at
>> org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:311)
>> at
>> org.mortbay.jetty.nio.HttpChannelEndPoint.run(HttpChannelEndPoint.jav
>> a:270)
>> at
>> org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool
>> .java:475
>
> ----------------------------
> IONA Technologies PLC (registered in Ireland)
> Registered Number: 171387
> Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland
>
Re: JAX-RS (JSR 311) Sub Resource NullPointerException
Posted by Sergey Beryozkin <se...@iona.com>.
Hi
Looks lile what is causing the issue is that in hello() method a sub-resource, at the introspection time, is an interface.
I'm not sure yet if it's allowed by JAX-RS, probably yes...
Try to move
> @GET
> @Path("/age")
annotations from the HelloeImpl.getAge() to the corresponding interface method for a start. It may not fix the problem initially as
the runtime currently expects that a method to be invoked actually belongs to the implementation class (except for AOP cases where
it actually will work fine)... Possibly a minor fix would need to be applied to handle this scenario too.
As a temporarily workaround please return HelloeImpl in a hello() signature and it will work...
Cheers, Sergey
----- Original Message -----
From: "Olivier" <ol...@mutantzoo.com>
To: <us...@cxf.apache.org>
Sent: Monday, May 19, 2008 6:44 AM
Subject: JAX-RS (JSR 311) Sub Resource NullPointerException
> All,
>
> I have implemented a set of basic classes in order to test the use of JAX-RS sub resources and found a NullPointerException (see
> end of message for stack trace).
> I am getting the CXF 2.1 version from the maven repository.
>
> In my example, I have 2 methods:
>
> hello
> hello2
>
> hello2 is a resource method marked with a @GET and a @PATH
> hello is a sub resource method without a @GET but with a @PATH
>
> Both methods return an Helloe object. A call to hello2 via a browser
> (http://localhost:9095/mzt-services/services/HelloRest/helloservice/hello2/toto) works fine and returns something like:
>
> <helloe>
> <age>10</age>
> <name>toto</name>
> </helloe>
>
> The call to hello via a browser (http://localhost:9095/mzt-services/services/HelloRest/helloservice/hello/toto/age) returns the
> following: (exception is pasted at the end)
>
> <ns1:XMLFault>
> <ns1:faultstring>java.lang.NullPointerException</ns1:faultstring>
> </ns1:XMLFault>
>
> The code for the Root Resource (the REST service is):
>
> @Path("helloservice")
> public class HelloServiceImpl implements HelloService
> {
> @Path("hello/{name}")
> public Helloe hello(@PathParam("name")
> String name)
> {
> Helloe helloe = new HelloeImpl();
> // Hardcode values
> helloe.setName(name);
> helloe.setAge(10);
> return helloe;
> }
>
> @GET
> @Path("hello2/{name}")
> public Helloe hello2(@PathParam("name")
> String name)
> {
> Helloe helloe = new HelloeImpl();
> // Hardcode values
> helloe.setName(name);
> helloe.setAge(10);
> return helloe;
> //return "<name>" + name + "</name>";
> }
> }
>
> The code for the HelloeImpl class is:
>
> @XmlRootElement(name = "helloe")
> public class HelloeImpl implements Helloe
> {
> private String name;
>
> private int age;
>
> public HelloeImpl() {
> // TODO Auto-generated constructor stub
> }
>
> @GET
> @Path("/name")
> public String getName()
> {
> return name;
> }
>
> public void setName(String name)
> {
> this.name = name;
> }
>
> @GET
> @Path("/age")
> public int getAge()
> {
> return age;
> }
>
> public void setAge(int age)
> {
> this.age = age;
> }
> }
>
> Exception:
> =======
>
> May 18, 2008 10:23:23 PM org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor han
> dleMessage
> INFO: Found operation: hello
> May 18, 2008 10:23:23 PM org.apache.cxf.phase.PhaseInterceptorChain doIntercept
> INFO: Interceptor has thrown exception, unwinding now
> java.lang.NullPointerException
> at org.apache.cxf.jaxrs.JAXRSUtils.findTargetMethod(JAXRSUtils.java:237)
>
> at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:139)
> at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:53)
> at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInv
> okerInterceptor.java:56)
> at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecu
> tor.java:37)
> at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(Se
> rviceInvokerInterceptor.java:92)
> at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseIntercept
> orChain.java:221)
> at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainIniti
> ationObserver.java:78)
> at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDes
> tination.java:92)
> at org.apache.cxf.transport.servlet.ServletController.invokeDestination(
> ServletController.java:214)
> at org.apache.cxf.transport.servlet.ServletController.invoke(ServletCont
> roller.java:113)
> at org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCX
> FServlet.java:170)
> at org.apache.cxf.transport.servlet.AbstractCXFServlet.doGet(AbstractCXF
> Servlet.java:152)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
> at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:442
> )
> at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:3
> 57)
> at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:2
> 26)
> at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:6
> 15)
> at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHand
> lerCollection.java:150)
> at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.
> java:123)
> at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:1
> 41)
> at org.mortbay.jetty.Server.handle(Server.java:272)
> at org.mortbay.jetty.HttpConnection.handlerRequest(HttpConnection.java:3
> 96)
> at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpCo
> nnection.java:652)
> at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:488)
> at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:198)
> at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:311)
> at org.mortbay.jetty.nio.HttpChannelEndPoint.run(HttpChannelEndPoint.jav
> a:270)
> at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool
> .java:475
----------------------------
IONA Technologies PLC (registered in Ireland)
Registered Number: 171387
Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland