gpt4 book ai didi

jax-rs - java.lang.ClassCastException : org. glassfish.jersey.jackson.internal.JacksonAutoDiscoverable 无法转换为 spi.AutoDiscoverable

转载 作者:行者123 更新时间:2023-12-04 00:10:11 31 4
gpt4 key购买 nike

我是实现 REST API 服务的新手。我已经尝试了简单的资源来实现。不幸的是,我坚持了这个异常(exception)。我用谷歌搜索并尝试了很多选择,但没有运气。我不确定我做错了什么。请帮我。

  • 创建了一个动态 Web 项目“JersyJson”
  • 创建了一个名为 - JSONService.java 的资源(来源来自谷歌搜索)
  • 创建了一个 Java Bean 类 - Track.java(来源来自谷歌搜索)
  • 将项目转换为Maven项目
  • 为应用程序注释创建了一个应用程序文件 - JersyJson.java 文件
  • 使用最新的 Jersy Jars(版本:2.22.2)
  • 在 pom.xml 中导入和配置 jersey-media-json-jackson 和 jersey-media-moxy jars (2.22.2)

  • 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 网络服务器在 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(未知来源)
    在 java.util.AbstractCollection.addAll(未知来源)
    在 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)
    在 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)
    在 java.util.concurrent.FutureTask.run(未知来源)
    在 java.util.concurrent.ThreadPoolExecutor.runWorker(来源不明)
    在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源)
    在 java.lang.Thread.run(未知来源)

    最佳答案

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

    我通过让 Weblogic 拥有所有可发现的类而不是将“com.fasterxml.jackson.*”指定为首选应用程序包/资源来解决这个问题,以拥有我自己的 jackson 版本。

    关于jax-rs - java.lang.ClassCastException : org. glassfish.jersey.jackson.internal.JacksonAutoDiscoverable 无法转换为 spi.AutoDiscoverable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37145127/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com