我是实施REST API服务的新手。我已经尝试过简单的资源来实现。不幸的是我坚持这个例外。我用Google搜索并尝试了很多选项,但没有运气。我不确定我做错了什么。请帮帮我。
的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(未知来源)
答案 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>