Web Services Tomcat 7.0服务无法启动,并出现ClassNotFoundException:javax.ws.rs.ProcessingException

zujrkrfu  于 2022-11-15  发布在  Java
关注(0)|答案(3)|浏览(145)

I have a toy REST web service that I'm trying to deploy to Tomcat 7.0 server. The problem is I can't even start the server. Here's the error message I'm getting:
SEVERE: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/HelloWorldRestService]] at java.util.concurrent.FutureTask.report(FutureTask.java:133) at java.util.concurrent.FutureTask.get(FutureTask.java:199) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) at java.util.concurrent.FutureTask.run(FutureTask.java:273) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1170) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:640) at java.lang.Thread.run(Thread.java:853) Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/HelloWorldRestService]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) ... 6 more
Caused by: java.lang.NoClassDefFoundError: javax.ws.rs.ProcessingException at java.lang.J9VMInternals.prepareClassImpl(Native Method) at java.lang.J9VMInternals.prepare(J9VMInternals.java:1122) at java.lang.Class.getDeclaredFields(Class.java:685) at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:106) at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:263) at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:142) at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:67) at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:405) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:881) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:376) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5322) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 6 more Caused by: java.lang.ClassNotFoundException: javax.ws.rs.ProcessingException at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547) ... 20 more

SEVERE: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] at java.util.concurrent.FutureTask.report(FutureTask.java:133) at java.util.concurrent.FutureTask.get(FutureTask.java:199) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.startup.Catalina.start(Catalina.java:691) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:94) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) at java.lang.reflect.Method.invoke(Method.java:619) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456) Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) at java.util.concurrent.FutureTask.run(FutureTask.java:273) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1170) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:640) at java.lang.Thread.run(Thread.java:853) Caused by: org.apache.catalina.LifecycleException: A child container failed during start at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 6 more
SEVERE: The required Server component failed to start so Tomcat is unable to start. org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) at org.apache.catalina.startup.Catalina.start(Catalina.java:691) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:94) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) at java.lang.reflect.Method.invoke(Method.java:619) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456) Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Catalina]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 7 more Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 9 more Caused by: org.apache.catalina.LifecycleException: A child container failed during start at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 11 more
I'm using Jersey 2.x. Here're my jars:
javax.ws.rs-api-2.0-m10.jar
jersey-client.jar
jersey-common.jar
jersey-container-servlet.jar
jersey-container-servlet-core.jar
jersey-server.jar
My web.xml looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>HelloWorldRestService</display-name>
<servlet>
    <servlet-name>java.helloworldrestservice.resources.HelloWorldApplication</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

    <!-- Register JAX-RS Application, if needed. -->
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>java.helloworldrestservice.resources.HelloWorldApplication</param-value>
    </init-param>

    <!-- Register resources and providers under my.package. -->
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>java.helloworldrestservice.resources</param-value>
    </init-param>

    <!-- Enable Tracing support. -->
    <init-param>
        <param-name>jersey.config.server.tracing</param-name>
        <param-value>ALL</param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>java.helloworldrestservice.resources.HelloWorldApplication</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

HelloWorldApplication.java:

package java.helloworldrestservice.resources;

import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;

public class HelloWorldApplication extends Application 
{

@Override
public Set<Class<?>> getClasses()
{
    //log.info("starting the HelloWorld application...");
    Set<Class<?>> set = new HashSet<Class<?>>();
    set.add(HelloWorld.class);
    return set;
}
}

HelloWorld.java:

package java.helloworldrestservice.resources;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class HelloWorld {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello()
{
    return "Hello World!!";
}
}

What is wrong? Why do I see this missing ProcessingException class and how can I get rid of this error?
Thanks a lot!

6fe3ivhb

6fe3ivhb1#

wwwjavax.ws.rs.ProcessingException似乎是javax.ws.rs包的一部分,该包是rest包的一部分,但默认情况下不随Java或Tomcat一起提供。
它似乎包含在javax.ws.rs中。Maven存储库中也提供了javax.ws.rs的一个版本。
Jersey似乎引用但未实现此类。
https://jersey.java.net/apidocs/2.6/jersey/javax/ws/rs/class-use/ProcessingException.html
因此,您需要下载相应的jar并将其包含在类路径中,以便它能够使用ProcessingException并启动容器。
我做了一些调查。我 * 希望 * Jersey.java.net会提供这个库作为他们捆绑包的一部分。如果他们没有,你将不得不自己从Maven中取出REST先决条件。

ffdz8vbo

ffdz8vbo2#

抱歉,这段文字并不是针对你的问题量身定做的(但它应该能完成任务)。我回答了一个类似的问题,所以我只是重复使用它。
如果使用标准Tomcat安装(或其他servlet容器),AFAIK,您无法避免显式地告诉它在web.xml文件中启动哪些servlet *。让REST Web服务正常工作的最简单的方法是忘记完全扩展javax.ws.rs.core.Application,而只是在那里指定上下文路径。rs注解来声明实际的Web服务。
web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
>
  <servlet>
    <servlet-name>rest-test</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.domain.mypackage</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name> rest-test</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

两点值得注意:
1.您需要在WAR文件中捆绑REST实现,因为servlet容器通常不包含REST实现。因为Jersey是JAX-RS的参考实现,所以我在上面的servlet-class元素中使用了它。如果需要,您可以用Apache CXF实现替换它。

  1. init-param元素告诉Jersey在哪个包中搜索带有Web服务注解的Java文件。编辑此元素以指向您的Web服务。注意,如果您选择使用apache CXF而不是Jersey,则任何init-param元素中所需的内容都将不同。了解CXF的人请发布这些内容。
    如果您使用的是Maven,只需在pom.xml文件的dependencies部分中为jersey-servlet添加一个依赖项即可:
<dependencies>
  <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.18.2</version>
  </dependency>
  ...
</dependencies>

在此之后,使用Java类中的标准JAX-RS注解直接声明Web服务:

package com.domain.mypackage;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;
import javax.ws.rs.MatrixParam;
import javax.ws.rs.Path;

// It's good practice to include a version number in the path so you can have
// multiple versions deployed at once. That way consumers don't need to upgrade
// right away if things are working for them.
@Path("calc/1.0")
public class CalculatorV1_0 {
  @GET
  @Consumes("text/plain")
  @Produces("text/plain")
  @Path("addTwoNumbers")
  public String add(@MatrixParam("firstNumber") int n1, @MatrixParam("secondNumber") int n2) {
    return String.valueOf(n1 + n2);
  }
}

如果Tomcat安装在本地端口8080上运行,并且您将WAR文件部署到上下文myContext,请转到

http://localhost:8080/myContext/rest/calc/1.0/addTwoNumbers;firstNumber=2;secondNumber=3

......应产生预期结果(5)。
干杯!干杯!

  • 如果您知道一种不使用web.xml而将Jersey servlet添加到Tomcat中的上下文的方法--也许通过使用上下文或生命周期侦听器--请纠正我。
dwthyt8l

dwthyt8l3#

OP使用javax.ws.rs-apiversion 2.0-m10。预发布版本正在开发中,可能与最终版本存在差异。
在这个例子中,javax.ws.rs.ProcessingException类是不存在的。使用工件的最后一个version 2.0(在这个问题发布的一年发布的)应该可以解决这个问题。

相关问题