jakarta.servlet.ServletException:应在 org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet 中至少指定一个资源类

问题描述 投票:0回答:1

尝试升级到corretto-Java17、Tomcat 10.1.16/10.1.17。我已将所有 javax 包移动到 jakarta 包,将 spring 升级到版本 6,将 cxf 升级到版本 4。当我在 tomcat 中部署应用程序时,我看到以下错误:

jakarta.servlet.ServletException:至少应指定一个资源类

在org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet.getServiceClasses(CXFNonSpringJaxrsServlet.java:304) 在org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet.init(CXFNonSpringJaxrsServlet.java:153) 在 org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:944) 在org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:901) 在 org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:805) 在 org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4601) 在 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>         

我的配置CxfApp:

     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 {}
spring cxf java-17 tomcat10 jakarta-migration
1个回答
0
投票

将此更改为:jakarta.ws.rs.Application。由于 CXFNonSpringJaxrsServlet - jar 使用“jakarta.ws.rs.Application”作为其参数。所以问题解决了!!!

© www.soinside.com 2019 - 2024. All rights reserved.