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-name>contextConfigLocation</param-name>
<param-value>WEB-INF/beans.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</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
$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:
447)
at java.lang.Thread.run(Unknown Source)
I don't know what the deal is. Any help you can lend would be greatly
appreciated. Thanks.
Brad
On Apr 6, 2008, at 4:49 AM, Doug wrote:
On Sun, 6 Apr 2008, Brad O'Hearne wrote:
Thanks for the reply. Couple things -- first, @UriParam is now
apparently @PathParam. Additionally, I cannot get the paths to
work. I
repeatedly get Tomcat errors that there's "No operation matching
request path...", and others like it....still a black art....I'd love
to get this worked out, as I've got jax-rs loaded, I just need to be
able to hit it now. I've tried about every URL combination
possible....no dice.
@PathParam may well be the next JSR-311 incarnation, but at least for
apache-cxf-2.1-incubator-20080306.021818-37.zip the annotation that
works,
for me, is @Path.
Specifically, using my previous example,
I have a tomcat webapps project "reflncover" which I access by the
URL:
http://localhost:8080/reflncover/svc/rc/init/myclientid?arg1=val1&arg2=val2
The "svc" component of the URL originates from the WEB-INF/web.xml
file:
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/svc/*</url-pattern>
</servlet-mapping>
Also, in my beans.xml file (referenced by web.xml) I have:
<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="reflectionCoverage" address="/">
<jaxrs:serviceBeans>
<bean
class="au.net.mmsn.rc.services.ReflectionCoverageService" />
</jaxrs:serviceBeans>
</jaxrs:server>
It works for me.
Originally I had a bit of trouble figuring the format of the XML to
POST
to my /init/ REST service, so I ended up creating a dummy @GET service
URL that returned a dummy bean class (as XML) that I created and
populated within my ReflectionCovergeService class (below). Once I had
that then submitting the same XML structure back "just worked".
Hope this helps.
Doug
Prior to your post, I had reverted back to my Jax-WS frontend, and I
discovered that inheritance IS working on serialization (outbound
serialization on return types) but is NOT working on deserialization
(inbound deserialization of XML to Java types on parameters). The
problem is definitely there.
Not sure what you mean by "inheritance" here. I looked briefly at
JAX-WS
but wrapping everything in SOAP headers wasn't flexible enough for my
needs.
Hope this helps
Doug
On Apr 5, 2008, at 7:54 PM, Doug wrote:
On Sun, 6 Apr 2008, Brad O'Hearne wrote:
I've moved to 2.1 SNAPSHOT -- my @UriTemplate annotations still
won't
compile. Is there another dependency needed?
I think @UriTemplate was deprecated/replaced by @Path by the JSR-311
folks,
but their spec documents aren't uptodate (thats my understanding
anyway)
Something like the following works for me (from the 2.1 SNAPSHOT):
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.core.HttpContext;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ProduceMime;
import javax.ws.rs.ConsumeMime;
import javax.ws.rs.UriParam;
import javax.ws.rs.WebApplicationException;
@Path("/rc")
public class ReflectionCoverageService {
@POST
@Path("init/{clientId}")
@ProduceMime("text/plain")
public String init(@UriParam("clientId") String id, @HttpContext
UriInfo
info, SomeJavaBeanClass sjbc) {
MultivaluedMap params = info.getQueryParameters();