当前位置: 首页 > 知识库问答 >
问题:

java.lang.ClassCast异常:组织.玻璃鱼.泽西.杰克逊.内部.杰克逊自动发现不能投射到 spi.可自动发现

那安宁
2023-03-14

我是实现REST API服务的新手。我尝试了简单的资源来实现。不幸的是,我坚持这个例外。我在谷歌上搜索并尝试了许多选项,但运气不好。我不确定哪里做错了。请帮帮我。

  1. 创建了一个html" target="_blank">动态Web项目“JersyJson”
  2. 创建了名为-JSONService的资源。java(源代码来自google)
  3. 创建了JavaBean类-Track。java(源代码来自google)
  4. 将项目转换为Maven项目
  5. 已创建应用程序文件-JersyJson。应用程序注释的java文件
  6. 使用最新的Jersy Jars(版本:2.22.2)
  7. 已导入

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>

网站.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 (应用程序注释文件)

@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();

    }

}

轨道.java(简单豆类)

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 Web 服务器在 Eclispe 中运行此项目后,我收到以下错误,其中包含 404-Error 状态

严重:标准包装。throwable Java . lang . classcastexception:org . glassfish . jersey . Jackson . internal . jacksonautodiscovery无法转换为org . glassfish . jersey . SPI . auto discoverable at org . glassfish . jersey . model . internal . common config$2 . compare(common config . Java:594)at Java . util . treemap . put(未知源)at java.util.TreeSet.add(未知源)at Java . util . abstract collection . add all(未知源)at java.util.TreeSet

共有3个答案

钱经业
2023-03-14

在我的例子中,我使用了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>

类装入器属性已使用 该特性进行标记

委托=假

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

希望这有帮助。

卢书
2023-03-14

我遇到了同样的问题,但我得到了修复。存在依赖项冲突的问题。您已经包含了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 #

令狐烨烨
2023-03-14

我在Weblogic也遇到了同样的问题。JacksonAutoDiscoverable和AutoDiscovery似乎来自不同的类加载器,因此也有不同的版本。AutoDiscoverable存在于jersey common中,jackson AutoDiscovery存在于Jensey media json jackson中。

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

 类似资料:
  • 我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似

  • 我有一个带有以下注释的类: 我尝试的是忽略反序列化的json。但它不起作用。始终在 JSON 字符串到达时,Jackson lib 将填充 references 属性。如果我只使用@JsonIgnore注释,则 getter 不起作用。这个问题有什么解决方案吗? 谢啦

  • 问题内容: 在Jersey上使用Jackson 处理器时,何时以及为何需要在两者之间使用注释? 杰克逊(Jackson)还提供了自己的服务提供商以直接使用。这种方法缺少什么?还是为什么我比其他人更喜欢 ps:我也用弹簧 问题答案: 为了生成JSON,通常只需指定即可。但是,这将默认采用JAXB路由。 使用Object-> JAXB-> JSON,您必须注释要映射的类。这可以很好地工作,但是一旦您要

  • 我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A

  • 首先,我不熟悉Jython。我正在寻找一种将python代码集成到Java项目中的方法。因此我正在调查Jython。 我正在尝试将一个 json 字符串转换为 Java 对象 - 在 python 中。 首先,我一直在努力让Jython找到我的java类。由于缺乏更优雅的解决方案,我可以通过简单地执行以下操作来向前迈进: 无论如何。。。 我正在尝试以下操作: 但是,在运行时,我收到以下错误: 我不

  • 我想知道为什么没有一种坚定的方式来与杰克逊合作。我只想解析JSON字符串: 但我真的很困惑,我应该导入什么来实现这一点。根据这个链接,我尝试导入映射器asl。jar。但我得到了这个编译错误: 然后我尝试导入jackson-core-2.4.2和jackson-databind-2.4.2。所以没有编译错误,但我得到了这个运行时异常(在映射器定义行中): 请指导我应该导入哪些内容才能使用Jackso