为 JAX-RS 创建 JdkHttpServer 时出现 AbstractMethodError
AbstractMethodError when creating JdkHttpServer for JAX-RS
我正在尝试为 REST API 和以下 this question I used jersey's JdkHttpServer. I imported the necessary jars (from here) 创建一个 Java 服务器,但是当我启动服务器时出现以下错误:
Exception in thread "main" java.lang.AbstractMethodError: org.glassfish.jersey.jdkhttp.JdkHttpHandlerContainerProvider.createContainer(Ljava/lang/Class;Ljavax/ws/rs/core/Application;)Ljava/lang/Object;
at org.glassfish.jersey.server.ContainerFactory.createContainer(ContainerFactory.java:58)
at org.glassfish.jersey.jdkhttp.JdkHttpServerFactory.createHttpServer(JdkHttpServerFactory.java:78)
at PokerJAXRS.main(PokerJAXRS.java:16)
我的代码如下:
import com.sun.net.httpserver.HttpServer;
import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import java.net.URI;
public class PokerJAXRS {
private static String baseUri = "http://localhost:9998/";
public static void main(String[] args) throws Exception {
URI bUri = URI.create(baseUri);
HttpServer server = JdkHttpServerFactory.createHttpServer(bUri, new ResourceConfig(PokerResource.class));
System.out.println("Server running");
System.out.println("Visit: http://localhost:9998/");
System.out.println("Hit return to stop...");
System.in.read();
server.stop(0);
System.out.println("Server stopped");
}
}
在 PokerResource
中,我得到了 API 的所有路径。我是否遗漏了一些导入或我必须定义其他任何东西?
编辑: 这些是我正在使用的所有 jar 库:
对于使用 Java 的任何人,我的第一个建议是考虑依赖性管理方法。由于我更习惯于 Maven,我将在这里分享对我有用的作为 Maven pom.xml 文件的一部分的内容,但您始终可以根据更适合您的方式解决它:
<properties>
<jersey.version>2.33</jersey.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-jdk-http</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>${jersey.version}</version>
</dependency>
如您所见,这基本上是关于不混用不同版本的球衣。最后,在合适的时候使用 属性 来控制版本是一个很好的做法。
我正在尝试为 REST API 和以下 this question I used jersey's JdkHttpServer. I imported the necessary jars (from here) 创建一个 Java 服务器,但是当我启动服务器时出现以下错误:
Exception in thread "main" java.lang.AbstractMethodError: org.glassfish.jersey.jdkhttp.JdkHttpHandlerContainerProvider.createContainer(Ljava/lang/Class;Ljavax/ws/rs/core/Application;)Ljava/lang/Object;
at org.glassfish.jersey.server.ContainerFactory.createContainer(ContainerFactory.java:58)
at org.glassfish.jersey.jdkhttp.JdkHttpServerFactory.createHttpServer(JdkHttpServerFactory.java:78)
at PokerJAXRS.main(PokerJAXRS.java:16)
我的代码如下:
import com.sun.net.httpserver.HttpServer;
import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import java.net.URI;
public class PokerJAXRS {
private static String baseUri = "http://localhost:9998/";
public static void main(String[] args) throws Exception {
URI bUri = URI.create(baseUri);
HttpServer server = JdkHttpServerFactory.createHttpServer(bUri, new ResourceConfig(PokerResource.class));
System.out.println("Server running");
System.out.println("Visit: http://localhost:9998/");
System.out.println("Hit return to stop...");
System.in.read();
server.stop(0);
System.out.println("Server stopped");
}
}
在 PokerResource
中,我得到了 API 的所有路径。我是否遗漏了一些导入或我必须定义其他任何东西?
编辑: 这些是我正在使用的所有 jar 库:
对于使用 Java 的任何人,我的第一个建议是考虑依赖性管理方法。由于我更习惯于 Maven,我将在这里分享对我有用的作为 Maven pom.xml 文件的一部分的内容,但您始终可以根据更适合您的方式解决它:
<properties>
<jersey.version>2.33</jersey.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-jdk-http</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>${jersey.version}</version>
</dependency>
如您所见,这基本上是关于不混用不同版本的球衣。最后,在合适的时候使用 属性 来控制版本是一个很好的做法。