【问题标题】:Restful webservices with jersey and tomcat error: 404带有球衣和 tomcat 错误的 Restful Web 服务:404
【发布时间】:2015-12-17 21:49:12
【问题描述】:

我正在使用 eclipse 创建一个动态 Web 项目。 我正在使用 tomcat 7,我已经包含了 jersey 的 jar,这里是 jar:

aopalliance-repackaged-2.4.0-b31.jar
asm-debug-all-5.0.4.jar
hk2-api-2.4.0-b31.jar
hk2-locator-2.4.0-b31.jar
hk2-utils-2.4.0-b31.jar
javassist-3.18.1-GA.jar
javax.annotation-api-1.2.jar
javax.inject-2.4.0-b31.jar
javax.servlet-api-3.0.1.jar
javax.ws.rs-api-2.0.1.jar
jaxb-api-2.2.7.jar
jersey-client.jar
jersey-common.jar
jersey-container-servlet-core.jar
jersey-container-servlet.jar
jersey-guava-2.21.jar
jersey-media-jaxb.jar
jersey-server.jar
org.osgi.core-4.2.0.jar
osgi-resource-locator-1.0.1.jar
persistence-api-1.0.jar
validation-api-1.1.0.Final.jar

我的 xml 是:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>RESTful Jersey Hello World</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>Restful</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.lorenzo.rest</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Restful</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

运行我的项目时,跟踪是这样的:

set 21, 2015 12:30:52 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
AVVERTENZA: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Restful' did not find a matching property.
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: Server version:        Apache Tomcat/7.0.64
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: Server built:          Aug 19 2015 17:18:06 UTC
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: Server number:         7.0.64.0
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: OS Name:               Windows XP
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: OS Version:            5.1
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: Architecture:          x86
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: Java Home:             C:\Programmi\Java\jdk1.8.0_60\jre
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: JVM Version:           1.8.0_60-b27
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: JVM Vendor:            Oracle Corporation
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: CATALINA_BASE:         C:\Documents and Settings\gcappella\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp2
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: CATALINA_HOME:         C:\Programmi\Apache Software Foundation\Tomcat 7.0
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: Command line argument: -Dcatalina.base=C:\Documents and Settings\gcappella\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp2
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: Command line argument: -Dcatalina.home=C:\Programmi\Apache Software Foundation\Tomcat 7.0
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: Command line argument: -Dwtp.deploy=C:\Documents and Settings\gcappella\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp2\wtpwebapps
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: Command line argument: -Djava.endorsed.dirs=C:\Programmi\Apache Software Foundation\Tomcat 7.0\endorsed
set 21, 2015 12:30:52 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAZIONI: Command line argument: -Dfile.encoding=Cp1252
set 21, 2015 12:30:52 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFORMAZIONI: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Programmi\Java\jdk1.8.0_60\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Programmi/Java/jdk1.8.0_60/bin/../jre/bin/client;C:/Programmi/Java/jdk1.8.0_60/bin/../jre/bin;C:/Programmi/Java/jdk1.8.0_60/bin/../jre/lib/i386;C:\Programmi\Java\jdk1.8.0_60\bin;C:\oracle\ora92\bin;C:\Programmi\Oracle\jre\1.1.8\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Programmi\NTRU Cryptosystems\NTRU TCG Software Stack\bin\;C:\Programmi\Wave Systems Corp\Gemalto\Access Client\v5\;C:\Programmi\Gemplus\GemSafe Libraries\BIN;C:\Programmi\File comuni\Roxio Shared\DLLShared\;C:\Programmi\File comuni\Roxio Shared\9.0\DLLShared\;C:\Programmi\ZipGenius 6\;c:\Programmi\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\Serena\Dimensions 14.1\CM\prog;C:\Programmi\Microsoft\Web Platform Installer\;C:\Programmi\Git\cmd;C:\Programmi\Git\mingw32\bin;C:\Programmi\Git\usr\bin;ANT_HOME%\bin;C:\Programmi\nodejs\;C:\Documents and Settings\gcappella\Dati applicazioni\npm;C:\eclipse;;.
set 21, 2015 12:30:52 PM org.apache.coyote.AbstractProtocol init
INFORMAZIONI: Initializing ProtocolHandler ["http-bio-8080"]
set 21, 2015 12:30:52 PM org.apache.coyote.AbstractProtocol init
INFORMAZIONI: Initializing ProtocolHandler ["ajp-bio-8009"]
set 21, 2015 12:30:52 PM org.apache.catalina.startup.Catalina load
INFORMAZIONI: Initialization processed in 835 ms
set 21, 2015 12:30:52 PM org.apache.catalina.core.StandardService startInternal
INFORMAZIONI: Starting service Catalina
set 21, 2015 12:30:52 PM org.apache.catalina.core.StandardEngine startInternal
INFORMAZIONI: Starting Servlet Engine: Apache Tomcat/7.0.64
set 21, 2015 12:30:53 PM org.apache.catalina.loader.WebappClassLoader validateJarFile
INFORMAZIONI: validateJarFile(C:\Documents and Settings\gcappella\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp2\wtpwebapps\Restful\WEB-INF\lib\javax.servlet-api-3.0.1.jar) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/servlet/Servlet.class
set 21, 2015 12:30:54 PM org.apache.catalina.startup.TldConfig execute
INFORMAZIONI: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
set 21, 2015 12:30:55 PM org.apache.coyote.AbstractProtocol start
INFORMAZIONI: Starting ProtocolHandler ["http-bio-8080"]
set 21, 2015 12:30:55 PM org.apache.coyote.AbstractProtocol start
INFORMAZIONI: Starting ProtocolHandler ["ajp-bio-8009"]
set 21, 2015 12:30:55 PM org.apache.catalina.startup.Catalina start
INFORMAZIONI: Server startup in 3587 ms

所以现在我认为我的问题一定出在 xml 中...有什么问题???

【问题讨论】:

    标签: java eclipse rest tomcat jersey


    【解决方案1】:

    这应该通过更新您的 Java 版本来解决。

    根本原因是Unsupported major.minor version 51.0。这意味着,org/glassfish/jersey/servlet/init/JerseyServletContainerInitializer 类适用于 Java 7。因此使用 Java 7 或更高版本将解决您的问题。

    【讨论】:

      【解决方案2】:

      这是你的问题:

      Caused by: java.lang.UnsupportedClassVersionError: org/glassfish/jersey/servlet/init/JerseyServletContainerInitializer : Unsupported major.minor version 51.0 (unable to load class org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer)
      

      您需要higher version JDK

      【讨论】:

      • 我必须更改为已安装的 jre 吗?我有:jdk 1.8_40 jdk 1.8_60 jre 6(那个是前一个)但是换成其他 jdk 错误仍然存​​在
      • @Lorenzo 您需要 JDK 7,因为我认为您使用的是最新的 Jersey 版本 2.17.x。但是使用 JDK 8 应该可以。由于更高的 JDK 向下兼容,即它们可以充当旧的 JDK。只需将项目的执行环境更改为 JDK 7。
      • 我已经改变了,如果你看到我的编辑,改变执行环境后的跟踪是不同的
      【解决方案3】:

      问题的关键是日志中的这一行:

      Caused by: java.lang.UnsupportedClassVersionError: org/glassfish/jersey/servlet/init/JerseyServletContainerInitializer : Unsupported major.minor version 51.0 (unable to load class org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer)
      

      这意味着 JVM 无法读取已编译的类文件,因为它是为比您当前运行的版本更新的虚拟机编译的。

      正如您在Wikipedia 上看到的那样,版本 51.0 意味着该类是为 Java 7 或更高版本编译的。事实上,正如您在 the Jersey docs 中看到的那样,从 Jersey 2.6 开始,Java 7 是必需的。

      您的日志记录还会显示当前使用的 Java 版本:

      INFO: JVM Version:           1.6.0_45-b06
      

      这确实太老了。运行 Java 7 或更高版本应该可以解决您的问题。

      【讨论】:

        【解决方案4】:

        Jersey 2.6,您可以使用 Java 6(JDK 1.6) 运行它。

        版本 2.6 + 之后您需要 (JDK 1.7) Java 7

        供参考: 这是我的项目。它是功能齐全的项目,请参阅下文。 我使用的是 Jersey 2.6,因为我的生产服务器有 Java 6,所以我不得不将它从 Jersey 2.17 降低到 2.6。

        我像这样调用我的示例网络服务

        localhost:8080/OrderStatusWebService/rest/test/hello-world 
        

        在我的浏览器中

        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_2_5.xsd"
                  version="2.5">
        
            <display-name>Order Status REST WebService</display-name>
        
        
            <servlet>
                <servlet-name>jersey-serlvet</servlet-name>
                <servlet-class>org.glassfish.jersey.servlet.ServletContainer
                </servlet-class>
                <init-param>
                    <param-name>javax.ws.rs.Application</param-name>
                    <param-value>com.xxx.orderstatus.config.OrderStatusConfig</param-value>
        
                </init-param>
                <init-param>
                    <param-name>jersey.config.server.provider.scanning.recursive</param-name>
                    <param-value>true</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>
            </servlet>
            <servlet-mapping>
                <servlet-name>jersey-serlvet</servlet-name>
                <url-pattern>/rest/*</url-pattern>
            </servlet-mapping>
        
        
        </web-app>
        

        这是一个示例 Webservice 类

        package com.xxx.orderstatus.webservice;
        
        import javax.ws.rs.GET;
        import javax.ws.rs.Path;
        import javax.ws.rs.QueryParam;
        import javax.ws.rs.core.Response;
        
        @Path("/test")
        public class TestWebService 
        {
        
            @GET
            @Path("/hello-world")
            public Response checkAuth(@QueryParam("userId") String  userId) {
        
                return Response.status(200).entity("Hello").build();
            }
        
        
        }
        

        因为我的是一个 Maven 项目,所以这是我的 POM.xml。 请注意该属性 &lt;finalName&gt;OrderStatusWebService&lt;/finalName&gt;

        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <groupId>com.xxx.orderstatus</groupId>
            <artifactId>OrderStatusWebService</artifactId>
            <packaging>war</packaging>
            <version>1.0-SNAPSHOT</version>
            <name>OrderStatusWebService Maven Webapp</name>
            <url>http://maven.apache.org</url>
            <properties>
                <jdk.version>1.6</jdk.version>
                <jstl.version>1.2</jstl.version>
                <jcl-over-slf4j.version>1.7.5</jcl-over-slf4j.version>
            </properties>
            <repositories>
                <repository>
                    <id>codelds</id>
                    <url>https://code.lds.org/nexus/content/groups/main-repo</url>
                </repository>
                <repository>
                    <id>maven2-repository.java.net</id>
                    <name>Java.net Repository for Maven</name>
                    <url>http://download.java.net/maven/2/</url>
                    <layout>default</layout>
                </repository>
                <repository>
                    <id>snapshot-repository.java.net</id>
                    <name>Java.net Snapshot Repository for Maven</name>
                    <url>https://maven.java.net/content/repositories/snapshots/</url>
                    <layout>default</layout>
                </repository>
            </repositories>
            <dependencies>
        
                <!-- My Dependencies START -->
        
                <!-- Jersey -->
                <dependency>
                    <groupId>org.glassfish.jersey.containers</groupId>
                    <!-- if your container implements Servlet API older than 3.0, use "jersey-container-servlet-core" -->
                    <artifactId>jersey-container-servlet</artifactId>
                    <version>2.6</version>
                </dependency>
        
                <!-- JSTL -->
                <dependency>
                    <groupId>jstl</groupId>
                    <artifactId>jstl</artifactId>
                    <version>${jstl.version}</version>
                </dependency>
        
                <!-- JDBC -->
                <dependency>
                    <groupId>com.oracle</groupId>
                    <artifactId>ojdbc6</artifactId>
                    <version>11.2.0.3</version>
                </dependency>
        
                <!-- GSON -->
                <dependency>
                    <groupId>com.google.code.gson</groupId>
                    <artifactId>gson</artifactId>
                    <version>2.2.4</version>
                </dependency>
        
                <!-- These jars dont' come by default with the latest Jerser Server Container 
                    Jars -->
                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                    <version>2.5</version>
                    <scope>provided</scope>
                </dependency>
        
                <!-- Apache Commons Codec -->
                <dependency>
                    <groupId>commons-codec</groupId>
                    <artifactId>commons-codec</artifactId>
                    <version>1.10</version>
                </dependency>
        
        
                <!-- SLF4j and Log4j Libs -->
                <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                    <version>1.7.12</version>
                </dependency>
        
        
                <!-- Apache Commons IO -->
                <dependency>
                    <groupId>commons-io</groupId>
                    <artifactId>commons-io</artifactId>
                    <version>2.4</version>
                </dependency>
        
                <!-- Multipart Dependencies -->
                <dependency>
                    <groupId>org.glassfish.jersey.media</groupId>
                    <artifactId>jersey-media-multipart</artifactId>
                    <version>2.6</version>
                </dependency>
        
                <!-- Commons DBCP 1.4 Starts -->
                <dependency>
                    <groupId>commons-dbcp</groupId>
                    <artifactId>commons-dbcp</artifactId>
                    <version>1.4</version>
                </dependency>
        
        
        
                <!-- My Dependencies ENDS -->
        
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>3.8.1</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
            <build>
                <finalName>OrderStatusWebService</finalName>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>2.3.2</version>
                        <configuration>
                            <source>${jdk.version}</source>
                            <target>${jdk.version}</target>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </project>
        

        【讨论】:

        • 我之前也安装了 1.8_40 和 1.8_60 版本,但更改属性上的默认 jre 时错误仍然存​​在
        • @Lorenzo 如果是 maven 项目,则搜索 Execution envronment 并将其更改为 1.7。如果它是一个正常的动态 web 项目,更改项目的属性应该可以解决问题。右键单击该项目,进入 Project Facets 并将 Java facets 更改为 1.7。这应该有效。
        • @Lorenzo 那你肯定做的不对。很明显有JDK版本错误。不要将 Java 方面设置为 1.6 或 1.8 将其设置为 Java 1.7 这应该可以解决您的问题。请再试一次。在最坏的情况下,我建议您安装 JDK 7 并删除所有其他 JDK 版本(但这是您尝试了所有方法但似乎根本不起作用的时候)。万事如意!!
        • 我去项目->属性->项目方面->将java版本从1.6更改为1.7错误仍然在这里.. :(
        • 您使用的是哪个 Jersey API 版本?现在我认为你应该开始做一些疯狂的事情。如果您的 Jersey 版本为 2.6 及以下,请卸载所有 JDK 并仅安装 JDK 1.6。如果您的 Jersey 版本是 2.7 或更高版本,则卸载所有 JDK 并仅安装 JDK 7。这是一个小问题,当您执行上述任务时应该已经解决了。
        【解决方案5】:

        首先,您不应该将以下库包含在您的类路径中,因为它们 在tomcat库中可用。 javax.servlet-api-3.0.1.jar

        另外,请检查 jersey-container-servlet-core.jar,在您的情况下确实需要 jersey-container-servlet.jar 库,否则最好为您的项目的 lib 文件夹删除这些 jar。

        【讨论】:

        • 正如您在教程中看到的那样,我已经包含了他包含的所有库...无论如何将 jdk 的版本从 1.6 更改为 1.7 和 1.8 我总是出错....
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 2011-08-22
        • 2013-12-07
        相关资源
        最近更新 更多