ClassCastException: org.slf4j.impl.Log4jLoggerAdapter 不能 cast to ch.qos.logback.classic.Logger

2022-09-03 14:16:56

我遵循这个答案是为了在运行时添加一个追加器。尽管这适用于原始海报,但我在行中得到了这个例外:Logger logger = (Logger) LoggerFactory.getLogger("abc.xyz");

java.lang.ClassCastException: org.slf4j.impl.Log4jLoggerAdapter cannot be cast to ch.qos.logback.classic.Logger
    de.mypackage.controller.MyController.meinOeOrte(MyController.java:335)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

简单的问题...为什么它对他有用,而对我不起作用?9-3


答案 1

这看起来像是类路径中具有同一依赖项 (slf4j) 的多个版本的症状。

在日志中查找此消息:

SLF4J: Class path contains multiple SLF4J bindings.

它将默认使用它在类路径中找到的第一个 slf4j 引用。过去,我通过将 Logback 依赖项(logback-classic 和 logback-core)移动到 Maven pom.xml 文件的依赖项部分的顶部来解决此问题,这会将它们放在类路径的前面。这是一个脆弱的解决方案,它可能无法正常工作,具体取决于您的应用程序体系结构。(例如,如果您的启动项目在其 pom.xml中包含冲突的依赖项,并且您通过另一个项目及其 pom.xml 引用 Logback)


答案 2

由于项目或其他继承项目中已经存在 SLF4J 依赖项,因此在运行时可能会发生冲突。向我的文件添加排除项对我有用:POM

        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>

推荐