尝试升级到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 {}
将此更改为:jakarta.ws.rs.Application。由于 CXFNonSpringJaxrsServlet - jar 使用“jakarta.ws.rs.Application”作为其参数。所以问题解决了!!!