Jersey 2.x 在尝试使用 SpringBoot 记录请求时抛出 NegativeArraySizeException,对于非 GET 请求
Jersey 2.x throws NegativeArraySizeException when try to logging request, for non-GET requests, with SpringBoot
由于 Jersey 2.x 在最新版本中弃用了 LoggingFilter,我们继续使用 Jersey 自己的 request/response 日志记录以及 log4j2。我们正在使用 springboot。当我们使用 POST 方法访问 Web 服务时出现问题,它抛出 NegativeArraySizeException
java.lang.NegativeArraySizeException
at org.glassfish.jersey.logging.LoggingInterceptor.logInboundEntity(LoggingInterceptor.java:210) ~[jersey-common-2.23.2.jar:?]
at org.glassfish.jersey.logging.ServerLoggingFilter.filter(ServerLoggingFilter.java:108) ~[jersey-common-2.23.2.jar:?]
at org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:132) ~[jersey-server-2.23.2.jar:?]
at org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:68) ~[jersey-server-2.23.2.jar:?]
我的log4j2配置-
<!-- Jersey logger -->
<AsyncLogger name="org.glassfish" level="all" additivity="false">
<AppenderRef ref="Console" level="off" />
<AppenderRef ref="RollingFileIO" level="all" />
</AsyncLogger>
如果我将日志级别设置为 off
,一切正常。
SpringBoot版本1.4.3
为了安全检查,我可以在 Wireshark 中看到传入的数据。
我得到了答案。为了让 jersey 写日志,我们注册了这个 -
jerseyConfig.register(
new LoggingFeature(
java.util.logging.Logger.getLogger(LoggingFeature.DEFAULT_LOGGER_NAME),
java.util.logging.Level.SEVERE,
LoggingFeature.Verbosity.PAYLOAD_ANY,
Integer.MAX_VALUE)
);
这里第4个参数是maxEntitySize
,也就是Integer.MAX_VALUE。因此,在创建日志缓冲区时,jersey 正在使用 maxEntity + 1
初始化数组,这导致了异常。
我将此值更改为某个 lower/logical 数字,一切正常。
由于 Jersey 2.x 在最新版本中弃用了 LoggingFilter,我们继续使用 Jersey 自己的 request/response 日志记录以及 log4j2。我们正在使用 springboot。当我们使用 POST 方法访问 Web 服务时出现问题,它抛出 NegativeArraySizeException
java.lang.NegativeArraySizeException
at org.glassfish.jersey.logging.LoggingInterceptor.logInboundEntity(LoggingInterceptor.java:210) ~[jersey-common-2.23.2.jar:?]
at org.glassfish.jersey.logging.ServerLoggingFilter.filter(ServerLoggingFilter.java:108) ~[jersey-common-2.23.2.jar:?]
at org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:132) ~[jersey-server-2.23.2.jar:?]
at org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:68) ~[jersey-server-2.23.2.jar:?]
我的log4j2配置-
<!-- Jersey logger -->
<AsyncLogger name="org.glassfish" level="all" additivity="false">
<AppenderRef ref="Console" level="off" />
<AppenderRef ref="RollingFileIO" level="all" />
</AsyncLogger>
如果我将日志级别设置为 off
,一切正常。
SpringBoot版本1.4.3
为了安全检查,我可以在 Wireshark 中看到传入的数据。
我得到了答案。为了让 jersey 写日志,我们注册了这个 -
jerseyConfig.register(
new LoggingFeature(
java.util.logging.Logger.getLogger(LoggingFeature.DEFAULT_LOGGER_NAME),
java.util.logging.Level.SEVERE,
LoggingFeature.Verbosity.PAYLOAD_ANY,
Integer.MAX_VALUE)
);
这里第4个参数是maxEntitySize
,也就是Integer.MAX_VALUE。因此,在创建日志缓冲区时,jersey 正在使用 maxEntity + 1
初始化数组,这导致了异常。
我将此值更改为某个 lower/logical 数字,一切正常。