Re: jax-rs URLs not working (was: Base class members not serializing / deserializing)
Hi As far as I know annotations at the interface level will only supported in the 0.7 version (it's mandated in the corresponding version of the spec), and only method-level annotations will be inherited (I'll need to confirm it), Jersey does it on the current trunk (which is corresponds to the soon to be released stable 0.7 jaxrs-api). Brad, try to put the annotations on the actual root resource class, just to see that's working. Then at a later stage you may want to put the annotations on the superclass, but first try from the root resource class... Cheers, Sergey Maybe the annotations have to go in the implementation class instead/as well? I didn't use an interface - just an instantiatable class (with method bodies). Apart from broken POST data, thats the only other thing I can think of. Doug On Mon, 7 Apr 2008, Brad O'Hearne wrote: Doug, Thanks for the reply. I'm still getting the same errors, going to show you exactly what happens in my implementation. Here is my web.xml: !DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd; web-app context-param param-namecontextConfigLocation/param-name param-valueWEB-INF/beans.xml/param-value /context-param listener listener-class org.springframework.web.context.ContextLoaderListener /listener-class /listener servlet servlet-nameCXFServlet/servlet-name display-nameCXF Servlet/display-name servlet-class org.apache.cxf.transport.servlet.CXFServlet /servlet-class load-on-startup1/load-on-startup /servlet servlet-mapping servlet-nameCXFServlet/servlet-name url-pattern/services/*/url-pattern /servlet-mapping /web-app Here is my beans.xml: ?xml version=1.0 encoding=UTF-8? beans xmlns=http://www.springframework.org/schema/beans; xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance; xmlns:jaxrs=http://cxf.apache.org/jaxrs; xsi:schemaLocation= http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd; import resource=classpath:META-INF/cxf/cxf.xml / import resource=classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml / import resource=classpath:META-INF/cxf/cxf-servlet.xml / jaxrs:server id=userService address=/ jaxrs:serviceBeans bean class=com.brad.UserService / /jaxrs:serviceBeans /jaxrs:server /beans Here is my service interface (which is implemented by the UserService class referenced in beans.xml): @Path(/UserService) public interface IUserService { @POST @Path(authenticate) @ConsumeMime(application/xml) @ProduceMime(application/xml) AuthenticateResponse authenticate(AuthenticateRequest request); } Tomcat loads cleanly (as far as I can tell -- no exceptions). When I try to access this service with an xml payload and the following URL: http://localhost:8080/MyWebApp/services/UserService/authenticate I get the following exception on the server: Apr 6, 2008 7:38:46 AM org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor handleMessage SEVERE: No operation found for path: /UserService/authenticate/, contentType: application/xml, Accept contentType: */* Apr 6, 2008 7:38:46 AM org.apache.cxf.phase.PhaseInterceptorChain doIntercept INFO: Interceptor has thrown exception, unwinding now org.apache.cxf.interceptor.Fault: .No operation matching request path / UserService/authenticate/ is found, ContentType : application/xml, Accept : */*. at org .apache .cxf .jaxrs .interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java: 120) at org .apache .cxf .phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:220) at org .apache .cxf .transport .ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78) at org .apache .cxf .transport.servlet.ServletDestination.invoke(ServletDestination.java:92) at org .apache .cxf .transport .servlet.ServletController.invokeDestination(ServletController.java:214) at org .apache .cxf.transport.servlet.ServletController.invoke(ServletController.java: 113) at org .apache .cxf .transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java: 170) at org .apache .cxf .transport.servlet.AbstractCXFServlet.doPost(AbstractCXFServlet.java: 148) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org .apache .catalina .core .ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 290) at org .apache .catalina .core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org .apache .catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 233) at org .apache .catalina.core.StandardContextValve.invoke(StandardContextValve.java: 175) at org .apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 128) at org
Re: jax-rs URLs not working (was: Base class members not serializing / deserializing)
Sergey, It appears that putting the annotations on the implementation class (rather than the interface) resolved the path issues. You are right, apparently interface annotations are not supported. I really hope that these are supported in the future. However, I am still not out of the woods. The deserialization of parameters still is not working, and I am using the same XML payload that worked using jaxws. It seems to be choking on the default namespace in my XML. Here's the method getting called: @POST @Path(authenticate) @ConsumeMime(application/xml) @ProduceMime(application/xml) public AuthenticateResponse authenticate(AuthenticateRequest request) { and here's the XML being sent on the HTTP request: ?xml version=1.0 encoding=utf-8? AuthenticateRequest xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd=http://www.w3.org/2001/XMLSchema; password=password uid=username xmlns=http://us.service.securenow.whitenoise.com/; / Two things are happening. First, an exception gets thrown (which is shown below), and second, I do hit a breakpoint inside my authenticate method, but the request parameter is null. Here's the exception in the Tomcat logs: javax.xml.bind.UnmarshalException: unexpected element (uri:http://us.service.securenow.whitenoise.com/ , local:AuthenticateRequest). Expected elements are {}AuthenticateRequest at com .sun .xml .bind .v2 .runtime .unmarshaller .UnmarshallingContext.handleEvent(UnmarshallingContext.java:603) at com .sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java: 244) at com .sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java: 239) at com .sun .xml .bind .v2 .runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java: 116) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext $DefaultRootLoader.childElement(UnmarshallingContext.java:1009) at com .sun .xml .bind .v2 .runtime .unmarshaller .UnmarshallingContext._startElement(UnmarshallingContext.java:446) at com .sun .xml .bind .v2 .runtime .unmarshaller .UnmarshallingContext.startElement(UnmarshallingContext.java:427) at com .sun .xml .bind .v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java: 137) at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source) at org .apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source) at org .apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) at org.apache.xerces.impl.XMLNSDocumentScannerImpl $NSContentDispatcher.scanRootElementHook(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl $FragmentContentDispatcher.dispatch(Unknown Source) at org .apache .xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at com .sun .xml .bind .v2 .runtime .unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:211) at com .sun .xml .bind .v2 .runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java: 184) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source) at org .apache .cxf .jaxrs.provider.JAXBElementProvider.readFrom(JAXBElementProvider.java: 62) at org.apache.cxf.jaxrs.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:495) at org.apache.cxf.jaxrs.JAXRSUtils.processParameter(JAXRSUtils.java: 312) at org.apache.cxf.jaxrs.JAXRSUtils.processParameters(JAXRSUtils.java: 287) at org .apache .cxf .jaxrs .interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java: 133) at org .apache .cxf .phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:220) at org .apache .cxf .transport .ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78) at org .apache .cxf .transport.servlet.ServletDestination.invoke(ServletDestination.java:92) at org .apache .cxf .transport .servlet.ServletController.invokeDestination(ServletController.java:214) at org .apache .cxf.transport.servlet.ServletController.invoke(ServletController.java: 113) at org .apache .cxf .transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java: 170) at org .apache .cxf .transport.servlet.AbstractCXFServlet.doPost(AbstractCXFServlet.java: 148) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org .apache .catalina .core
Re: jax-rs URLs not working (was: Base class members not serializing / deserializing)
Never mind on this.got it all worked out now. THANK YOU big time to the gents copied (and Daniel) for your advice. It would be great to get some of this stuff in a doc somewhere. Here was my winning formula: - Java 1.6.x - CXF 2.1-incubator-snapshot - Do not annotate interfaces, but implementation classes only. - Jax-RS (0.6 for the api) - annotate all parameter and return types with explicit @XmlType, @XmlRootElement, and explicit namespaces Everything appears to be working now. I still have some enums to get straight, but it looks like I'm out of the woods. Thanks again for your help guys. Brad On Apr 7, 2008, at 12:07 PM, Brad O'Hearne wrote: Sergey, It appears that putting the annotations on the implementation class (rather than the interface) resolved the path issues. You are right, apparently interface annotations are not supported. I really hope that these are supported in the future. However, I am still not out of the woods. The deserialization of parameters still is not working, and I am using the same XML payload that worked using jaxws. It seems to be choking on the default namespace in my XML. Here's the method getting called: @POST @Path(authenticate) @ConsumeMime(application/xml) @ProduceMime(application/xml) public AuthenticateResponse authenticate(AuthenticateRequest request) { and here's the XML being sent on the HTTP request: ?xml version=1.0 encoding=utf-8? AuthenticateRequest xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd=http://www.w3.org/2001/XMLSchema; password=password uid=username xmlns=http://us.service.securenow.whitenoise.com/; / Two things are happening. First, an exception gets thrown (which is shown below), and second, I do hit a breakpoint inside my authenticate method, but the request parameter is null. Here's the exception in the Tomcat logs: javax.xml.bind.UnmarshalException: unexpected element (uri:http://us.service.securenow.whitenoise.com/ , local:AuthenticateRequest). Expected elements are {}AuthenticateRequest at com .sun .xml .bind .v2 .runtime .unmarshaller .UnmarshallingContext.handleEvent(UnmarshallingContext.java:603) at com .sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java: 244) at com .sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java: 239) at com .sun .xml .bind .v2 .runtime .unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext $DefaultRootLoader.childElement(UnmarshallingContext.java:1009) at com .sun .xml .bind .v2 .runtime .unmarshaller .UnmarshallingContext._startElement(UnmarshallingContext.java:446) at com .sun .xml .bind .v2 .runtime .unmarshaller .UnmarshallingContext.startElement(UnmarshallingContext.java:427) at com .sun .xml .bind .v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java: 137) at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source) at org .apache .xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source) at org .apache .xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) at org.apache.xerces.impl.XMLNSDocumentScannerImpl $NSContentDispatcher.scanRootElementHook(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl $FragmentContentDispatcher.dispatch(Unknown Source) at org .apache .xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at com .sun .xml .bind .v2 .runtime .unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:211) at com .sun .xml .bind .v2 .runtime .unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source) at org .apache .cxf .jaxrs .provider.JAXBElementProvider.readFrom(JAXBElementProvider.java:62) at org.apache.cxf.jaxrs.JAXRSUtils.readFromMessageBody(JAXRSUtils.java: 495) at org.apache.cxf.jaxrs.JAXRSUtils.processParameter(JAXRSUtils.java: 312) at org.apache.cxf.jaxrs.JAXRSUtils.processParameters(JAXRSUtils.java:287) at org .apache .cxf .jaxrs .interceptor .JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:133) at org .apache .cxf .phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java: 220) at org .apache .cxf .transport .ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78) at org
jax-rs URLs not working (was: Base class members not serializing / deserializing)
Doug, Thanks for the reply. I'm still getting the same errors, going to show you exactly what happens in my implementation. Here is my web.xml: !DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd; web-app context-param param-namecontextConfigLocation/param-name param-valueWEB-INF/beans.xml/param-value /context-param listener listener-class org.springframework.web.context.ContextLoaderListener /listener-class /listener servlet servlet-nameCXFServlet/servlet-name display-nameCXF Servlet/display-name servlet-class org.apache.cxf.transport.servlet.CXFServlet /servlet-class load-on-startup1/load-on-startup /servlet servlet-mapping servlet-nameCXFServlet/servlet-name url-pattern/services/*/url-pattern /servlet-mapping /web-app Here is my beans.xml: ?xml version=1.0 encoding=UTF-8? beans xmlns=http://www.springframework.org/schema/beans; xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance; xmlns:jaxrs=http://cxf.apache.org/jaxrs; xsi:schemaLocation= http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd; import resource=classpath:META-INF/cxf/cxf.xml / import resource=classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml / import resource=classpath:META-INF/cxf/cxf-servlet.xml / jaxrs:server id=userService address=/ jaxrs:serviceBeans bean class=com.brad.UserService / /jaxrs:serviceBeans /jaxrs:server /beans Here is my service interface (which is implemented by the UserService class referenced in beans.xml): @Path(/UserService) public interface IUserService { @POST @Path(authenticate) @ConsumeMime(application/xml) @ProduceMime(application/xml) AuthenticateResponse authenticate(AuthenticateRequest request); } Tomcat loads cleanly (as far as I can tell -- no exceptions). When I try to access this service with an xml payload and the following URL: http://localhost:8080/MyWebApp/services/UserService/authenticate I get the following exception on the server: Apr 6, 2008 7:38:46 AM org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor handleMessage SEVERE: No operation found for path: /UserService/authenticate/, contentType: application/xml, Accept contentType: */* Apr 6, 2008 7:38:46 AM org.apache.cxf.phase.PhaseInterceptorChain doIntercept INFO: Interceptor has thrown exception, unwinding now org.apache.cxf.interceptor.Fault: .No operation matching request path / UserService/authenticate/ is found, ContentType : application/xml, Accept : */*. at org .apache .cxf .jaxrs .interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java: 120) at org .apache .cxf .phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:220) at org .apache .cxf .transport .ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78) at org .apache .cxf .transport.servlet.ServletDestination.invoke(ServletDestination.java:92) at org .apache .cxf .transport .servlet.ServletController.invokeDestination(ServletController.java:214) at org .apache .cxf.transport.servlet.ServletController.invoke(ServletController.java: 113) at org .apache .cxf .transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java: 170) at org .apache .cxf .transport.servlet.AbstractCXFServlet.doPost(AbstractCXFServlet.java: 148) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org .apache .catalina .core .ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 290) at org .apache .catalina .core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org .apache .catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 233) at org .apache .catalina.core.StandardContextValve.invoke(StandardContextValve.java: 175) at org .apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 128) at org .apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 102) at org .apache .catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java: 844) at org.apache.coyote.http11.Http11Protocol
Re: jax-rs URLs not working (was: Base class members not serializing / deserializing)
Maybe the annotations have to go in the implementation class instead/as well? I didn't use an interface - just an instantiatable class (with method bodies). Apart from broken POST data, thats the only other thing I can think of. Doug On Mon, 7 Apr 2008, Brad O'Hearne wrote: Doug, Thanks for the reply. I'm still getting the same errors, going to show you exactly what happens in my implementation. Here is my web.xml: !DOCTYPE web-app PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN http://java.sun.com/dtd/web-app_2_3.dtd; web-app context-param param-namecontextConfigLocation/param-name param-valueWEB-INF/beans.xml/param-value /context-param listener listener-class org.springframework.web.context.ContextLoaderListener /listener-class /listener servlet servlet-nameCXFServlet/servlet-name display-nameCXF Servlet/display-name servlet-class org.apache.cxf.transport.servlet.CXFServlet /servlet-class load-on-startup1/load-on-startup /servlet servlet-mapping servlet-nameCXFServlet/servlet-name url-pattern/services/*/url-pattern /servlet-mapping /web-app Here is my beans.xml: ?xml version=1.0 encoding=UTF-8? beans xmlns=http://www.springframework.org/schema/beans; xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance; xmlns:jaxrs=http://cxf.apache.org/jaxrs; xsi:schemaLocation= http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd; import resource=classpath:META-INF/cxf/cxf.xml / import resource=classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml / import resource=classpath:META-INF/cxf/cxf-servlet.xml / jaxrs:server id=userService address=/ jaxrs:serviceBeans bean class=com.brad.UserService / /jaxrs:serviceBeans /jaxrs:server /beans Here is my service interface (which is implemented by the UserService class referenced in beans.xml): @Path(/UserService) public interface IUserService { @POST @Path(authenticate) @ConsumeMime(application/xml) @ProduceMime(application/xml) AuthenticateResponse authenticate(AuthenticateRequest request); } Tomcat loads cleanly (as far as I can tell -- no exceptions). When I try to access this service with an xml payload and the following URL: http://localhost:8080/MyWebApp/services/UserService/authenticate I get the following exception on the server: Apr 6, 2008 7:38:46 AM org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor handleMessage SEVERE: No operation found for path: /UserService/authenticate/, contentType: application/xml, Accept contentType: */* Apr 6, 2008 7:38:46 AM org.apache.cxf.phase.PhaseInterceptorChain doIntercept INFO: Interceptor has thrown exception, unwinding now org.apache.cxf.interceptor.Fault: .No operation matching request path / UserService/authenticate/ is found, ContentType : application/xml, Accept : */*. at org .apache .cxf .jaxrs .interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java: 120) at org .apache .cxf .phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:220) at org .apache .cxf .transport .ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78) at org .apache .cxf .transport.servlet.ServletDestination.invoke(ServletDestination.java:92) at org .apache .cxf .transport .servlet.ServletController.invokeDestination(ServletController.java:214) at org .apache .cxf.transport.servlet.ServletController.invoke(ServletController.java: 113) at org .apache .cxf .transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java: 170) at org .apache .cxf .transport.servlet.AbstractCXFServlet.doPost(AbstractCXFServlet.java: 148) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org .apache .catalina .core .ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 290) at org .apache .catalina .core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org .apache .catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 233) at org .apache .catalina.core.StandardContextValve.invoke(StandardContextValve.java: 175) at org .apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 128) at org .apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 102)