小编Ant*_*s42的帖子

中止的Ajax调用在服务器日志中提供ClientAbortException/Broken管道:如何捕获/抑制?

我正在运行一个Jboss服务器,其中包括一个JAX-RS Web服务(使用与Jboss/EAP捆绑在一起的resteasy-2.3.6.Final).

当客户端中止与服务器的呼叫时,RestEasy的SynchronousDispatcher可以(显然)不发送响应返回给其造成了一堆错误的在客户端[SEVERE][ERROR]水平在我的服务器日志显示出来.

但是,我不认为这些是实际错误,所以我不想看到它们.特别是一旦服务将被公开使用,这必然会发生.

这是我想要抑制的日志输出:

12:50:38,938 SEVERE [org.jboss.resteasy.core.SynchronousDispatcher] (http-localhost/127.0.0.1:8080-2) Failed executing GET /ajax/findPerson: org.jboss.resteasy.spi.WriterException: ClientAbortException:  java.net.SocketException: Broken pipe
    at org.jboss.resteasy.core.ServerResponse.writeTo(ServerResponse.java:262) [resteasy-jaxrs-2.3.6.Final-redhat-1.jar:2.3.6.Final-redhat-1]
    ....

Caused by: ClientAbortException:  java.net.SocketException: Broken pipe
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:403) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:356) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:426) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:415) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
    ...

Caused by: java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method) [rt.jar:1.7.0_51]
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) [rt.jar:1.7.0_51]
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159) [rt.jar:1.7.0_51]
    at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:711) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:450) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:351) [jbossweb-7.2.0.Final-redhat-1.jar:7.2.0.Final-redhat-1]
    ...

12:50:38,942 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/myapplication].[MyAjaxApplication]] (http-localhost/127.0.0.1:8080-2) JBWEB000236: Servlet.service() for servlet …
Run Code Online (Sandbox Code Playgroud)

jboss error-logging exception-handling jax-rs resteasy

14
推荐指数
1
解决办法
1283
查看次数

Gson反序列化:如何区分缺少的字段和显式设置为null的字段?

我正在尝试为我正在构建的Java(JAX-RS)Web服务实现JSON Merge Patch.

要点是通过将JSON文档发送到仅包含应更改的字段的服务器来完成记录的部分更新.

鉴于此记录

{
  "a": "b",
  "c": {
    "d": "e",
    "f": "g"
  }
}
Run Code Online (Sandbox Code Playgroud)

,以下JSON更新文档

{
  "a":"z",
  "c": {
    "f": null
  }
}
Run Code Online (Sandbox Code Playgroud)

应该为里面设置一个新值"a" 并删除."f""c"

后者是问题所在.我不知道如何区分f缺失的输入和f为null的输入.据我所知,两者都将null在目标Java对象中反序列化.

做什么?

java serialization json gson

6
推荐指数
1
解决办法
2109
查看次数

如何在注入JAX-RS Web服务的CDI bean中获取HTTP请求标头?

我有这样的网络服务:

@Path("/projects")
public class Projects {
    [...]

    @Inject
    CurrentRequest current;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("{id}")
    public Response getProject(@PathParam("id") String id) {
        if (current.isUserAuthenticated()) {
            [...do something...]
        } else {
            [...produce an error...]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个带有auth checker方法的CDI bean,如下所示:

@RequestScoped
public class CurrentRequest {

    public boolean isUserAuthenticated() {
        [...do some header checking...]
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我不能为我的生活从内部抓住HTTP标头CurrentRequest.我试过注射HttpServletRequest,但它没有初始化.我试过用@Context同样的东西.显然FacesContext.getCurrentInstance()不起作用,因为没有FacesContext.

我看到这个问题基本上是在问同样的问题,但是没有得到太多的关注.

我目前的方法是使用@Context HttpServletRequest request内部Projects并将其作为参数传递给current.isUserAuthenticated(request).但那感觉很糟糕.CDI bean不应该知道它自己的请求吗?

我错过了什么?

java jax-rs httprequest cdi

5
推荐指数
1
解决办法
2438
查看次数

web.xml 中定义的 <error-page> 始终返回 HTTP 状态 200

我有一个在 Jboss 7 (EAP 6.4) 上运行的 EE6 JAX-RS 应用程序,并通过ExceptionMapper.

不过,在某些情况下(最明显的是当 HTTP 基本身份验证失败时),由于错误发生在调用应用程序之前,因此不会调用此方法,因此客户端会获取服务器的默认错误页面(JBWEB bla bla,具有难看的紫色的 HTML) )。

现在为了捕获这些“外部”错误,我添加了<error-page>定义,web.xml如下所示:

<error-page>
    <location>/error.json</location>
</error-page>
<error-page>
    <error-code>401</error-code>
    <location>/error401.json</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)

该位置工作正常,我几乎得到了我想要的响应,但 HTTP 状态代码始终为 200。

至少可以说,这很烦人。如何让错误页面返回正确的错误代码?

java error-handling servlet-3.0 jakarta-ee

5
推荐指数
1
解决办法
2075
查看次数

如何初始化可选&lt;List&lt;T&gt;&gt;?

这相当简单。我有一个列表字段,可能存在也可能不存在(但必须与null未初始化时不同),但是虽然我可以

List<String> mylist = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

我不能做

Optional<List<String>> mylist = Optional.of(new ArrayList<String>());
Run Code Online (Sandbox Code Playgroud)

因为类型不匹配。这是不幸的。我不想硬连线我的代码来使用 ArrayList。

有没有解决的办法?

java java-8 option-type

4
推荐指数
1
解决办法
2万
查看次数

我可以创建一个请求范围的对象并从任何地方访问它,并避免将其作为参数传递给JAX-RS吗?

假设我有一个Web服务/一个使用某些HTTP标头参数调用的REST资源。resource方法构建一个复杂的数据对象(当前为POJO),并最终将其返回给客户端(通过Gson作为JSON,但这无关紧要)。

所以我有这个调用层次结构:

@Path(foo) ProjectResource @GET getProject()
-> new Project()
-> new List<Participant> which contains lots of new Participant()s
-> new Affiliation()
Run Code Online (Sandbox Code Playgroud)

如果我想Affiliation根据标题参数以英语或德语填充对象,则必须将其作为参数传递给链下。我想避免这样做。也许这从根本上讲是不可能的,但是感觉太不对了。所有这些对象仅存在于请求中,因此能够从任何地方访问与请求相关的信息是否方便?

我希望我可以例如定义一个CDI @RequestScoped对象,该对象会初始化自身(或由某些WebFilter填充),然后可以在可能需要的位置注入。

但是显然,这在POJO内部是行不通的,而且我也很难从请求范围的对象内部获取标头。

我已经阅读了许多关于EJB,JAX-RS上下文和CDI的SO问题/答案,但是我无法解决。

我期望太多了吗?传递参数确实是首选选项吗?

jax-rs cdi

0
推荐指数
1
解决办法
968
查看次数