我在Grizzly服务器上为Jersey应用程序运行以下简单示例:
@Path("example")
public class example {
@POST
public Response someMethod(@Context Request r) {
System.out.println("Received request at : " + LocalDateTime.now());
Response response = Response.ok().build();
return response;
}
}
public class GrizzlyServerMain {
public static HttpServer startServer(String BASE_URI) throws IOException {
// Scans for JAX-RS resources and providers in the specified code-package
final ResourceConfig resourceConfig = new PackagesResourceConfig("Application");
// create and start a new instance of grizzly http server exposing the Jersey application at BASE_URI
return GrizzlyServerFactory.createHttpServer(BASE_URI, resourceConfig);
}
public static void main(String[] args) throws IOException {
String BASE_URI = "http://0.0.0.0:8000";
// Base URI the Grizzly HTTP server will listen on
startServer(BASE_URI);
//noinspection ResultOfMethodCallIgnored
System.in.read();
}
}
当我从IntelliJ运行它时,一切都按预期工作。
连接到目标VM,地址:'127.0.0.1:61163',传输: 'socket'2016年12月30日下午4:00:07 com.sun.jersey.api.core.PackagesResourceConfig init INFO:正在扫描 包中的根资源和提供者类:Application Dec 30,2016 4:00:08 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses INFO:找到的根资源类:class Application.Greetings类Application.example 2016年12月30日4:00:08 PM com.sun.jersey.api.core.ScanningResourceConfig init INFO:不 找到提供程序类。 2016年12月30日下午4:00:08 com.sun.jersey.server.impl.application.WebApplicationImpl _initiate 信息:启动Jersey应用程序,版本'Jersey:1.19.3 2016年10月24日下午03:43,2016年12月30日下午4:00:08 org.glassfish.grizzly.http.server.NetworkListener启动信息:已启动 听众绑定到[0.0.0.0:8000] 2016年12月30日下午4:00:08 org.glassfish.grizzly.http.server.HttpServer启动INFO:[HttpServer] 入门 收到请求:2016-12-30T16:00:13.097 收到请求时间:2016-12-30T16:00:14.319 收到请求:2016-12-30T16:00:15.583 断开与目标VM的连接,地址: '127.0.0.1:61163',transport:'socket'
但是当我创建一个包含所有依赖项的JAR时,只要我从客户端发送请求,我就会得到:
警告:FilterChain执行期间出现异常 java.lang.IllegalStateException 在org.glassfish.grizzly.http.server.io.OutputBuffer.reset(OutputBuffer.java:217) 在org.glassfish.grizzly.http.server.Response.reset(Response.java:732) 在org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:168) 在org.glassfish.grizzly.filterchain.ExecutorResolver $ 9.execute(ExecutorResolver.java:119) 在org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:265) 在org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) 在org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:134) 在org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) 在org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:78) 在org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:815) 在org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 在org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) 在org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access $ 100(WorkerThreadIOStrategy.java:55) 在org.glassfish.grizzly.strategies.WorkerThreadIOStrategy $ WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) 在org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:567) 在org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:547) 在java.lang.Thread.run(未知来源)
你能告诉我我能做错什么吗?
答案 0 :(得分:1)
异常似乎已从IllegalStateException更改为IllegalArgumentException。
查看ContainerProvider的Java Doc。
ContainerProvider是一个SPI类,它的实现将由您使用的服务器提供,在您的情况下是Grizzly服务器。
根据Java Doc:
实现(服务提供者)通过在资源中放置提供者配置文件(如果尚未存在),“com.sun.jersey.spi.container.ContainerProvider”来标识自己目录META-INF / services,包括文件中实现的完全限定的service-provider-class。 。
所以,我认为您需要将“META-INF / services”更新到您的jar并将提供者添加为“GrizzlyContainerProvider”(包合格)。
您可以看一下类似的帖子: Grizzly and Jersey standalone jar