latest CXF with Spring: WARNING: javax.ws.rs.NotFoundException

30,464

Solution 1

Solution-1

One of the solution is that version issue with CXF and Spring. I have made cxf version to 2.5.2 which avoids javax.ws.rs.NotFoundException.

Now I have updated to

<spring.version>3.2.2.RELEASE</spring.version>
<cxf.version>2.5.2</cxf.version>

I was using 2.7.5 cxf version.

Solution -2

In my service class I have made

@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) instead of

@Produces(MediaType.TEXT_XML)

Solution 2

The URL you are using to fire the GET request has two services levels:

http://localhost:8080/assignment/services/services/"

but in your REST service class, there is only one 'services' level in Path. You may need to change the Path Param to like this:

@Service
@Path("/services/")
public class UserServiceImpl implements UserService {

    @GET
    @Path("services/{userName}/{password}")
    @Produces(MediaType.TEXT_XML)
    public String login(@PathParam("userName")String username, @PathParam("password")String password)
            throws JAXBException, PropertyException, FileNotFoundException {

Solution 3

I think "services" is by default the path where CXF exposes the auto-generated WADLs and therefore cannot be used in a resource path.

Try either changing "services" to another word in your web.xml and Service class (@Path) or change the CXF servlet config like so (see the service-list-path param):

<servlet>
    <servlet-name>cxf</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <init-param>
        <param-name>service-list-path</param-name>
        <param-value>web-services</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

Reference: http://cxf.apache.org/docs/jaxrs-services-description.html (section Service listings and WADL queries almost at the end).

Note that you can override the location at which listings are provided (in case you would like '/services' be available to your resources) using 'service-list-path' CXFServlet parameter

Solution 4

As described in CXF project throws java.lang.NoClassDefFoundError: javax/ws/rs/NotFoundException the

Error can be solved by adding

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0-m10</version>
</dependency>

Solution 5

one common reason for this error is that cxf cannot find a restful implementation for the restful service to match the request to the resource method later. the spec is ambiguious in this area but your jaxrs annotations in the interface must match implementation in cxf. --eliani

Share:
30,464
AKB
Author by

AKB

#SOreadytohelp

Updated on July 05, 2022

Comments

  • AKB
    AKB almost 2 years

    I am able to access REST services from the browser url: http://localhost:8080/assignment/services/services/test/test1

    From My servlet, I use to call service method as shown below. Now I need to call through REST services but getting below error.

    URL url = new URL("http://localhost:8080/assignment/services/services/"+userName+"/"+password);
                System.out.println("URL-->"+url);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setRequestProperty("Accept", "application/xml");
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                while(bufferedReader.readLine() != null){
                    result = bufferedReader.readLine();
                }
    //          result = userService.login(userName, password);
                System.out.println(result);
    

    here is the error:

    INFO: Reloading Context with name [/assignment] is completed
    URL-->http://localhost:8080/assignment/services/test/test1
    Jul 30, 2013 12:52:02 PM org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor processRequest
    WARNING: No root resource matching request path /assignment/services/test/test1 has been found, Relative Path: /test/test1. Please enable FINE/TRACE log level for more details.
    Jul 30, 2013 12:52:02 PM org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse
    WARNING: javax.ws.rs.NotFoundException
        at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:172)
        at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:100)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
        at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
        at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
        at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:223)
        at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:203)
        at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
        at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java
    
    
    ...
    
    
    Jul 30, 2013 12:52:02 PM org.apache.catalina.core.StandardWrapperValve invoke
    SEVERE: Servlet.service() for servlet [LoginServlet] in context with path [/assignment] threw exception
    java.io.FileNotFoundException: http://localhost:8080/assignment/services/services/test/test1
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1623)
        at com.viasat.test.login.servlet.LoginServlet.process(LoginServlet.java:77)
        at com.viasat.test.login.servlet.LoginServlet.doPost(LoginServlet.java:52)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    

    Service class:

    @Service
    @Path("/services/")
    public class UserServiceImpl implements UserService {
    
    @GET
        @Path("{userName}/{password}")
        @Produces(MediaType.TEXT_XML)
        public String login(@PathParam("userName")String username, @PathParam("password")String password)
                throws JAXBException, PropertyException, FileNotFoundException {
    

    web.xml:

       <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>cxf</servlet-name>        
            <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>        
            <load-on-startup>1</load-on-startup>
        </servlet> 
      <servlet>
        <display-name>LoginServlet</display-name>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.abc.test.login.servlet.LoginServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/LoginServlet</url-pattern>
    </servlet-mapping>
        <servlet-mapping>
            <servlet-name>cxf</servlet-name>
            <url-pattern>/services/*</url-pattern>
        </servlet-mapping>
    </web-app>
    

    Update: pom.xml:

      <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.9.12</version>
       </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
            <version>2.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>3.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>3.2.3.RELEASE</version>
        </dependency>
    

    Now Javax.ws.rs.NotFoundException gone, but, File not found exception still comes.

    • drvdijk
      drvdijk almost 11 years
      You say you request it like: URL url = new URL("http://localhost:8080/assignment/services/services/"+us‌​erName+"/"+password)‌​; System.out.println("URL-->"+url);, yet the log shows: URL-->http://localhost:8080/assignment/services/test/test1?
    • AKB
      AKB almost 11 years
      sorry, I was testing with different values as per below comment.
  • Juned Ahsan
    Juned Ahsan almost 11 years
    @akb In web.xml, you need to have the mapping to your application context, which is assignment and not services. Then follow the advicein my answer
  • Juned Ahsan
    Juned Ahsan almost 11 years
    @akb You should put one fixed path in the method path param. See my updated code in resolution.
  • Juned Ahsan
    Juned Ahsan almost 11 years
    @akb can u share the web.xml
  • Juned Ahsan
    Juned Ahsan almost 11 years
    You need to change this line <url-pattern>/services/*</url-pattern> to <url-pattern>/assignment/*</url-pattern>