Hi Gabo
It apperas that the root cause of it is that a subresource method is invoked
and it returns null.
Now, JAXRSInvoker does check for 'null' but I can see now that the check is faulty, as the null is wrapped in a CXF specific wrapper
initially....I'll update the code now....Can you confirm please that your subresource method return null ?
Cheers, SErgey
Hi Gabo
NPE is always a bug - so I need to investigate.
Can you please post the spring configuration which you use (in sample form but with the same relationships between beans, etc...)
?
And a sample MyService bean ?
By the way is there any chance that spring 2.0.6 is still hanging around somewhere on the IPlanet's classpath, perhaps on the
system one ?
As additional info:
"/some/path/MyService/search" is meant to match an annotated method as follows:
@GET
@Path("/search/")
public MyObjects getMyObjects(
@HeaderParam("uri")
SearchObject so){
just missed the '/' after the keyword 'search'
"/some/path/MyService/search" has to match this method....Or do you mean
something else ?
Thanks, Sergey
Hi All,
On another occassion. The cause of the problem is obviously the path used. Not
sure why a NPE was thrown instead.
[25/Mar/2009:08:04:49] info (26158): for host 222.127.215.98 trying to GET
/some/path/MyService/searchobjectid='1'+and+balance+between+1+and+2/objectid/1/10, service-j2ee reports: Interceptor has thrown
exception, unwinding now
java.lang.NullPointerException
at
org.apache.cxf.common.util.SpringAopClassHelper.getRealClassInternal(SpringAopClassHelper.java:47)
at
org.apache.cxf.common.util.ClassHelper.getRealClass(ClassHelper.java:47)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:160)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:70)
at
org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:57)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:417)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
at java.util.concurrent.FutureTask.run(FutureTask.java:123)
at
org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)
at
org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:95)
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.servlet.ServletDestination.invoke(ServletDestination.java:99)
at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:337)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:145)
at
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:163)
at
org.apache.cxf.transport.servlet.AbstractCXFServlet.doGet(AbstractCXFServlet.java:145)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:787)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:908)
at
org.apache.catalina.core.StandardWrapperValve.invokeServletService(StandardWrapperValve.java:771)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:322)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:212)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:209)
at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
at
com.iplanet.ias.web.connector.nsapi.NSAPIProcessor.process(NSAPIProcessor.java:161)
at com.iplanet.ias.web.WebContainer.service(WebContainer.java:580)
As additional info:
"/some/path/MyService/search" is meant to match an annotated method as follows:
@GET
@Path("/search/")
public MyObjects getMyObjects(
@HeaderParam("uri")
SearchObject so){
just missed the '/' after the keyword 'search'
Gabo
Gabo Manuel wrote:
Hi All,
Just to add, the exception does not have a cause. fault.getCause() returns
null. :(
Gabo
Gabo Manuel wrote:
Hi All,
I encountered this during one of my test:
Service.java:
@GET
@Path("/search/")
@WebMethod
public MyObjects getMyObjects(
@HeaderParam("uri")
@WebParam(name="searchObject")
SearchObject so) {
}
SearchObject.java:
@XmlRootElement
@XmlType(name="SearchObject")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class SearchObject {
public SearchObject(){
}
//important point here is that there is no other constructor other than
default.
}
I accessed the said method and encountered the following exception:
javax.ws.rs.WebApplicationException
at
org.apache.cxf.jaxrs.utils.InjectionUtils.reportServerError(InjectionUtils.java:237)
at
org.apache.cxf.jaxrs.utils.InjectionUtils.handleParameter(InjectionUtils.java:224)
at
org.apache.cxf.jaxrs.utils.InjectionUtils.createParameterObject(InjectionUtils.java:404)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processHeaderParam(JAXRSUtils.java:594)
at
org.apache.cxf.jaxrs.utils.JAXRSUtils.createHttpParameterValue(JAXRSUtils.java:495)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:442)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:397)
at
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:182)
at
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:65)
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.servlet.ServletDestination.invoke(ServletDestination.java:99)
at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:337)
at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:145)
at
org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:163)
at
org.apache.cxf.transport.servlet.AbstractCXFServlet.doGet(AbstractCXFServlet.java:145)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:787)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:908)
at
org.apache.catalina.core.StandardWrapperValve.invokeServletService(StandardWrapperValve.java:771)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:322)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:212)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:209)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:509)
at
com.iplanet.ias.web.connector.nsapi.NSAPIProcessor.process(NSAPIProcessor.java:161)
at com.iplanet.ias.web.WebContainer.service(WebContainer.java:580)
The above print out is generated as:
//this is registered as a provider.
RuntimeExceptionMapper.java:
private String generateMessage(RuntimeException fault, String subject){
String appDir = new File(".").getAbsolutePath();
//TODO: turn this to html for better viewing.
StringBuffer sb = new StringBuffer();
sb.append("\r\n");
sb.append("\r\nApplication location: ").append(appDir);
sb.append("\r\n");
sb.append("\r\nProblem encountered: ").append((fault.getMessage()==null || fault.getMessage().length()<1)?"No
message":fault.getMessage());
sb.append("\r\n");
sb.append("\r\nStack trace: ");
for(StackTraceElement ste : fault.getStackTrace()){
sb.append("\t").append(ste.toString()).append("\r\n");
}
return sb.toString();
}
The JAXRSInInterceptor in the stacktrace led me to somewhere useful in checking
where it failed. I saw this log earlier up:
[25/Mar/2009:04:33:33] failure (24718): for host 222.127.215.98 trying to GET /some/domain/MyObjects/search, service-j2ee
reports: Parameter Class some.domain.SearchObject has no constructor with single String parameter, static valueOf(String) or
fromString(String) methods
I am going to modify my code to include all the cause exceptions when available. But would it be possible to echo the message
up the stream? I mean, it seems unnecessary to include all the causes when a message from the root cause echoed at the latest
exception could easily give an idea of what caused the problem.
Thanks.
Gabo
------------------------------------------------------------------------
No virus found in this incoming message.
Checked by AVG - www.avg.com Version: 8.0.238 / Virus Database: 270.11.25/2019
- Release Date: 03/23/09 18:51:00
------------------------------------------------------------------------
No virus found in this incoming message.
Checked by AVG - www.avg.com Version: 8.0.238 / Virus Database: 270.11.25/2019
- Release Date: 03/23/09 18:51:00