java.lang.ClassCastException:org.glassfish.jersey.jackson.internal.JacksonAutoDiscoverable无法强制转换为spi.AutoDiscoverable

时间:2016-05-10 17:23:34

标签: jax-rs

我是实施REST API服务的新手。我已经尝试过简单的资源来实现。不幸的是我坚持这个例外。我用Google搜索并尝试了很多选项,但没有运气。我不确定我做错了什么。请帮帮我。

  1. 创建了一个动态Web项目" JersyJson"
  2. 创建了一个名为-JSONService.java的资源(源自google搜索)
  3. 创建了一个Java Bean类--Track.java(源来自谷歌搜索)
  4. 将项目转换为Maven项目
  5. 为Application Annotation创建了一个Application文件 - JersyJson.java文件
  6. 使用最新的Jersy Jars(版本:2.22.2)
  7. 进口&在pom.xml中配置了jersey-media-json-jackson和jersey-media-moxy jar(2.22.2)
  8. 的pom.xml

    <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/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>JersyJson</groupId>
      <artifactId>JersyJson</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>war</packaging>
    
       <dependencies>
       <dependency>
          <groupId>javax.ws.rs</groupId>
              <artifactId>javax.ws.rs-api</artifactId>
              <version>2.0.1</version>
            </dependency> 
        <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.22.2</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.22.2</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
        <version>2.22.2</version>
    </dependency>
    
      </dependencies>
    
      <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>
          <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
              <warSourceDirectory>WebContent</warSourceDirectory>
              <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    

    Web.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>JersyJson</display-name>
    
    
        <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
    </servlet>
    
        <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/json/metallica/*</url-pattern>
    </servlet-mapping>
    
    
    </web-app>
    

    JersyJson.java(ApplicationAnnotation文件)

    @ApplicationPath("json")
    public class JersyJson extends ResourceConfig {
        public JersyJson() {
            packages("com.sai.jersyjson");
        }
    }
    

    JSONservice.java:

    package com.sai.jersyjson;
    
    import javax.ws.rs.Consumes;
    import javax.ws.rs.GET;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.Response;
    
    
    
    @Path("/json/metallica")
    public class JSONService {
    
        @GET
        @Path("/get")
        @Produces(MediaType.APPLICATION_JSON)
        public Track getTrackInJSON() {
    
            Track track = new Track();
            track.setTitle("Enter Sandman");
            track.setSinger("Metallica");
    
            return track;
    
        }
    
        @POST
        @Path("/post")
        @Consumes(MediaType.APPLICATION_JSON)
        public Response createTrackInJSON(Track track) {
    
            String result = "Track saved : " + track;
            return Response.status(201).entity(result).build();
    
        }
    
    }
    

    Track.java(简单的bean类)

    package com.sai.jersyjson;
    
    public class Track {
    
        String title;
        String singer;
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getSinger() {
            return singer;
        }
    
        public void setSinger(String singer) {
            this.singer = singer;
        }
    
        @Override
        public String toString() {
            return "Track [title=" + title + ", singer=" + singer + "]";
        }
    
    }
    

    在使用Tomcat webserver在Eclispe中运行此项目后,我得到以下内容 错误与404错误状态

    严重:StandardWrapper.Throwable java.lang.ClassCastException:org.glassfish.jersey.jackson.internal.JacksonAutoDiscoverable无法强制转换为org.glassfish.jersey.internal.spi.AutoDiscoverable     在org.glassfish.jersey.model.internal.CommonConfig $ 2.compare(CommonConfig.java:594)     在java.util.TreeMap.put(未知来源)     在java.util.TreeSet.add(未知来源)     at java.util.AbstractCollection.addAll(Unknown Source)     在java.util.TreeSet.addAll(未知来源)     在org.glassfish.jersey.model.internal.CommonConfig.configureAutoDiscoverableProviders(CommonConfig.java:616)     在org.glassfish.jersey.server.ResourceConfig.configureAutoDiscoverableProviders(ResourceConfig.java:811)     在org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:447)     在org.glassfish.jersey.server.ApplicationHandler.access $ 500(ApplicationHandler.java:184)     在org.glassfish.jersey.server.ApplicationHandler $ 3.call(ApplicationHandler.java:350)     在org.glassfish.jersey.server.ApplicationHandler $ 3.call(ApplicationHandler.java:347)     在org.glassfish.jersey.internal.Errors.process(Errors.java:315)     在org.glassfish.jersey.internal.Errors.process(Errors.java:297)     在org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255)     在org.glassfish.jersey.server.ApplicationHandler。(ApplicationHandler.java:347)     在org.glassfish.jersey.servlet.WebComponent。(WebComponent.java:392)     在org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)     在org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369)     在javax.servlet.GenericServlet.init(GenericServlet.java:158)     在org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1238)     在org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1041)     在org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4996)     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5285)     在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)     在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1408)     在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1398)     at java.util.concurrent.FutureTask.run(Unknown Source)     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)     at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)     在java.lang.Thread.run(未知来源)

4 个答案:

答案 0 :(得分:1)

我在Weblogic中遇到了完全相同的问题。似乎 JacksonAutoDiscoverable AutoDiscoverable 来自不同的类加载器,因此来自不同的版本。 jersey-common 中存在 AutoDiscoverable jersey-media-json-jackson 中存在 JacksonAutoDiscoverable

我解决了这个问题,让Weblogic拥有所有可发现的类,而是将“com.fasterxml.jackson。*”指定为 prefer-application-packages / resources 以拥有我自己的jackson版本。

答案 1 :(得分:1)

我有同样的问题,但我得到了修复。存在冲突依赖关系的问题。您已经包含 jersey-media-json-jackson 依赖项,但Tomcat Web容器已经提供了这些类。

只需将范围标记添加到您的依赖项中:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.27</version>
    <scope>provided</scope>
</dependency>

有关详细信息,请参阅该链接:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#

答案 2 :(得分:0)

就我而言,我与Glassfish合作,并且在项目中具有Glassfish描述符(glassfish-web.xml),如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
  <class-loader delegate="false"/>
  <parameter-encoding default-charset="UTF-8"/>
  <jsp-config>
    <property name="keepgenerated" value="true">
      <description>Keep a copy of the generated servlet class' java code.</description>
    </property>
  </jsp-config>
</glassfish-web-app>

class-loader属性标记有属性

  

delegate = false

,我认为这是我的错误,因为正如Glassfish部署指南所述,当您公开服务时,此属性必须为true。 https://javaee.github.io/glassfish/doc/4.0/application-deployment-guide.pdf#G11.1006531 对我有用的解决方案是删除该文件,并仅保留标准部署描述符(web.xml)。

希望获得帮助。

答案 3 :(得分:0)

我在 JBOSS6 服务器上遇到了同样的问题。将 jersey-media-moxy 依赖添加到 pom 文件后,成功了。

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.25.1</version>
</dependency>