当尝试使用SpringBoot记录非GET请求的请求时,Jersey 2.x会抛出NegativeArraySizeException

the*_*ses 3 java log4j2 jersey-2.0 spring-boot

由于Jersey 2.x在最新版本中弃用了LoggingFilter,我们继续使用Jersey自己的请求/响应日志记录以及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:?]
Run Code Online (Sandbox Code Playgroud)

我的log4j2配置 -

<!-- Jersey logger -->
<AsyncLogger name="org.glassfish" level="all" additivity="false">
    <AppenderRef ref="Console" level="off" />
    <AppenderRef ref="RollingFileIO" level="all" />
</AsyncLogger>
Run Code Online (Sandbox Code Playgroud)

如果我将日志级别设置为off,一切正常.SpringBoot版本1.4.3

只是为了安全检查,我能够在Wireshark中看到传入的数据.

the*_*ses 9

我得到了答案.为了让球衣写下日志记录,我们正在注册这个 -

     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)
       );
Run Code Online (Sandbox Code Playgroud)

这里,第四个参数maxEntitySize是Integer.MAX_VALUE.因此,在创建日志记录缓冲区时,jersey正在初始化数组maxEntity + 1,这导致异常.

我将此值更改为某个较低/逻辑数字,并且工作正常.