Trying to upgrade to corretto-Java17, Tomcat 10.1.16/10.1.17 . I have moved all javax package to jakarta package, upgraded spring to version6 and cxf to version-4.When I deployed my application in tomcat, I see below error as:

jakarta.servlet.ServletException: At least one resource class should be specified

at org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet.getServiceClasses(CXFNonSpringJaxrsServlet.java:304) at org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet.init(CXFNonSpringJaxrsServlet.java:153) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:944) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:901) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:805) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4601) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4894)*

web.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app  xmlns="https://jakarta.ee/xml/ns/jakartaee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   
 xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee 
 https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
                   version="5.0">
     
     <context-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>classpath*:papi- 
    plugin.xml,classpath*:papi- 
    server.xml,classpath*:applicationContext.xml</param-value>
         </context-param>
     <listener>
  <listener-class> 
   org.springframework.web.context.ContextLoaderListener
  </listener- class>
         </listener>
     
         <servlet>
             <servlet-name>CXFServlet</servlet-name>
             <servlet-class>
 org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet
 </servlet- class>
             <init-param>
                 <param-name>
 jakarta.ws.rs.core.Application</param-name>
                 <param-value>
 com.resource.ProvisionCxfApp</param-value>
             </init-param>
             <load-on-startup>1</load-on-startup>
         </servlet>
     
         <servlet-mapping>
             <servlet-name>CXFServlet</servlet-name>
             <url-pattern>/prv/v1/*</url-pattern>
         </servlet-mapping>
     
     <servlet>
             <servlet-name>abc</servlet-name>
             <servlet-class>
 org.springframework.web.servlet.DispatcherServlet</servlet- 
 class>
             <load-on-startup>1</load-on-startup>
         </servlet>
     
         <servlet-mapping>
             <servlet-name>abc</servlet-name>
             <url-pattern>/servlet/*</url-pattern>
         </servlet-mapping>

 </web-app>         

My ProvisionCxfApp:

     import jakarta.servlet.ServletException;
     import jakarta.ws.rs.core.Application;
     public class ProvisionCxfApp extends Application {
    
      private final Set<Object> singletons = new HashSet<Object>();
        /**
         * @return
         * @see jakarta.ws.rs.core.Application#getClasses()
         */
        @Override
        public Set<Class<?>> getClasses() {
            Set<Class<?>> set = new HashSet<Class<?>>();
            set.add(AResource.class);
            set.add(AcsResource.class);
            return set;
        }
    
        public ProvisionCxfApp() throws ServletException{       
            singletons.add(AResource.class);
            singletons.add(AcsResource.class);
      }}
Also have classes like :
  @Path("/ac/{id}")
  public class AResource extends BResource {}


  @Path("/acs")
  public class AcsResource extends BResource {}
1

There are 1 best solutions below

0
On

changed this to : jakarta.ws.rs.Application. Since CXFNonSpringJaxrsServlet - jar using "jakarta.ws.rs.Application" as its param. So issue got resolved !!!