gpt4 book ai didi

java - Jersey 在使用 ContainerRequestContext.abortWith() 后为每次调用抛出 NPE

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:03:36 25 4
gpt4 key购买 nike

我有一个 RESTful 端点,我通过自定义 ContainerRequestFilter 通过简单的授权检查来保护它。过滤器检查 HTTP session 中包含的所有信息是否正确,如果不正确,则执行此操作:

requestContext.abortWith(Response.status(Response.Status.FORBIDDEN)
.entity("Forbidden").build());

这一切都很好,花花公子。奇怪的是,当我再次发出相同的 GET 请求时,Jersey 服务器报告 NPE 并且不返回任何内容。

NPE 堆栈跟踪:

Jul 20, 2016 5:27:53 PM org.glassfish.jersey.server.ServerRuntime$Responder writeResponse
SEVERE: An I/O error has occurred while writing a response message entity to the container output stream.
java.lang.IllegalStateException: The output stream has already been closed.
at org.glassfish.jersey.message.internal.CommittingOutputStream.setStreamProvider(CommittingOutputStream.java:147)
at org.glassfish.jersey.message.internal.OutboundMessageContext.setStreamProvider(OutboundMessageContext.java:803)
at org.glassfish.jersey.server.ContainerResponse.setStreamProvider(ContainerResponse.java:372)
at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:694)
at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:444)
at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:434)
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:329)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.service(GrizzlyHttpContainer.java:384)
at org.glassfish.grizzly.http.server.HttpHandler$1.run(HttpHandler.java:224)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:745)

发生了什么事?我不想关闭输出流。我只需要一个方法来返回一个http返回码+消息给请求者。

最佳答案

万一有人遇到我遇到的同样问题,答案如下:您不能重复使用回复!输出流编写器的实例绑定(bind)到 Request,一旦您在 abortWith() 中使用它,流将永远提交。因此,它不能再用于发送响应。

您需要从 filter() 方法中初始化一个新的 Request。

简单来说,不要使用这样的结构:

 private static final Response ACCESS_FORBIDDEN = Response.status(Response.Status.FORBIDDEN)
.entity("Access blocked for all users !!").build();

顺便说一句,我在这里找到了这段损坏的代码: http://howtodoinjava.com/jersey/jersey-rest-security/因此,在实现此 RequestFilter 时要小心。

关于java - Jersey 在使用 ContainerRequestContext.abortWith() 后为每次调用抛出 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38484752/

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