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

Reply via email to