ClassCastException:org.slf4j.impl.Log4jLoggerAdapter无法强制转换为ch.qos.logback.classic.Logger

Era*_*ndo 11 java logging log4j logback slf4j

我正在按照这个答案,以便在运行时添加一个appender.虽然这适用于原始海报,但我得到了这个例外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)
Run Code Online (Sandbox Code Playgroud)

简单的问题......为什么它适合他而不适合我?:-P

Kyl*_*Vay 6

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

在日志中查找此消息:

SLF4J: Class path contains multiple SLF4J bindings.

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


gur*_*hni 6

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

        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
Run Code Online (Sandbox Code Playgroud)