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




Reply via email to