当前位置: 首页 > 知识库问答 >
问题:

配置应用程序启动前发生的日志

薛弘厚
2023-03-14
@SpringBootApplication
@ConfigurationPropertiesScan
class DemoApplication {

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {

            val webClient = WebClient.builder().build()

            val data = webClient.get()
                .uri("http://localhost:8080/home")
                .retrieve()
                .bodyToMono(Response::class.java)
                .block()?.data

            SpringApplicationBuilder(DemoApplication::class.java).run(*args)
        }
    }
}

data class Response(val data: String)

14:10:16.944[reactor-http-nio-1]调试org.springframework.http.codec.json.jackson2jsondecoder-[4EF27D66]解码[响应(data=hello)]
14:10:16.944[reactor-http-nio-1]调试reactor.netty.resources.pooledconnectionprovider-[ID:0x9a13da08,L:/127.0.0.1:62737-R:localhost/127.0.0.1:8080]onStateChange(GET{uri=/home,62737-R:localhost/127.0.0.1:8080]}},[response_completed])

我已经尝试通过在应用程序yaml中将它们的日志级别更改为info来禁用这些日志,如下所示,但这并不起作用,因为这种情况甚至发生在应用程序启动之前。

logging:
  level:
    org:
      springframework:
        web: info
        http:
          codec:
            json: info

是否有人有其他方法来禁用这些应用程序启动或webClient编解码器日志?

共有1个答案

郭曾笑
2023-03-14

向web客户端添加自定义编解码器对我来说很有效。在这个自定义编解码器中,我正在反序列化响应。

这是自定义编解码器

class MyMessageReader: HttpMessageReader<Response> {
    override fun getReadableMediaTypes(): MutableList<MediaType> {
        return mutableListOf()
    }

    override fun canRead(elementType: ResolvableType, mediaType: MediaType?): Boolean {
        return true
    }

    override fun read(elementType: ResolvableType, message: ReactiveHttpInputMessage, hints: MutableMap<String, Any>): Flux<Response> {
        return Flux.just(Jackson2JsonDecoder().objectMapper.readValue(message.toString(), Response::class.java))
    }

    override fun readMono(elementType: ResolvableType, message: ReactiveHttpInputMessage, hints: MutableMap<String, Any>): Mono<Response> {
        return message.body.map {
            val count = it.readableByteCount()
            val str = ByteArray(count)
            var count1 = 0
            while (count1 < count) {
                str[count1] = it.read()
                count1++
            }

            Jackson2JsonDecoder().objectMapper.readValue(str, Response::class.java)
        }.toMono()
    }
}

将编解码器注册到web客户端:

WebClient.builder().codecs {
                it.customCodecs().register(MyMessageReader())
            }.build()
@SpringBootApplication
@ConfigurationPropertiesScan
class DemoApplication {

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {

            val webClient = WebClient.builder().codecs {
                it.customCodecs().register(MyMessageReader())
            }.build()

            val data = webClient.get()
                .uri("http://localhost:8080/home")
                .retrieve()
                .bodyToMono(Response::class.java)
                .block()

            SpringApplicationBuilder(DemoApplication::class.java).run(*args)
        }
    }
}
 类似资料:
  • 我有一个Spring Boot 1.4.2应用程序。启动期间使用的一些代码如下所示: 有一个组件决定系统类型。此组件在从其他组件启动期间使用。在生产中,一切正常。 现在,我想使用Spring1.4的MockBean添加一些集成测试。 测试如下所示: 基本上,模拟效果很好。使用我的systemTypeDetectorMock,如果我调用getSystemType- 问题是应用程序没有启动。目前Spr

  • 下面是上面文件引用的: 但当以的身份运行InteliJ时,问题就会消失。

  • 问题内容: 据我所知,您只能使用VisualVM来分析正在运行的应用程序。 有谁知道使用VisualVM剖析Java应用程序启动和启动的方法吗? 我相信必须有一种方法,否则将是一个重大的疏忽。 希望我只是误读了文档。 谢谢,第 问题答案: 您是否要使用`-Xrunjdwp“命令行选项来设置性能分析?如果是,则该选项仅出于此目的具有” suspend“参数 : 如果要在加载主类之前立即挂起目标VM,

  • “Spring-Boot-AutoConfigure”,版本:'2.4.1'

  • 我正在尝试在web应用程序中使用Freemarker进行电子邮件模板制作。 我声明了一个FreeMarkerConfiguration FactoryBean,如下所示: 运行我的JUnit时一切正常,但在我的webapp中运行时,我的bean被Spring启动FreeMarkerAutoConfiguration“覆盖”。 我已尝试: 从我的gradle文件中删除sping-boot-start

  • 我仍然对vertx假设你将部署/启动你的应用程序的方式有些误解。仍然有两个问题,但它们对我来说几乎没有关系。 问题1:我有办法让您的应用程序可以从命令行和IDEA两种方式启动吗? 一方面,有一个类(由 Vert.x 提供)可以从命令行启动我们的应用程序。它为您提供了方法。但是,如果我从shell启动它,我将无法调试它,对吧? 另一方面,要在IDEA中选择你的应用程序,你需要手动创建main方法。此