web-dev-qa-db-ja.com

ClassCastException:org.slf4j.impl.Log4jLoggerAdapterをch.qos.logback.classic.Loggerにキャストできない

私はランタイムにアペンダーを追加するために this 回答に従っていました。これは元のポスターでは機能しますが、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)

簡単な質問...なぜそれが彼のために機能し、私のためには機能しないのですか? :-P

11
Erando

これは、クラスパスに同じ依存関係(slf4j)の複数のバージョンがあることの症状のようです。

ログでこのメッセージを確認します。

SLF4J: Class path contains multiple SLF4J bindings.

デフォルトでは、クラスパスで最初に見つかったslf4j参照を使用します。これまでは、Logbackの依存関係(logback-classicおよびlogback-core)をMaven pom.xmlファイルの依存関係セクションの一番上に移動することで、これを修正してきました。これは脆弱なソリューションであり、アプリケーションアーキテクチャによっては機能しない場合があります。 (たとえば、起動プロジェクトのpom.xmlに競合する依存関係が含まれていて、別のプロジェクトとそのpom.xmlを通じてLogbackを参照している場合)

6
Kyle McVay

プロジェクトまたは他の継承されたプロジェクトにSLF4Jの既存の依存関係があるため、実行時に競合が発生する可能性があります。 POMファイルに除外を追加するとうまくいきました:

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

この場合、LoggerとLoggerFactoryに使用しているライブラリが同じであることを確認してください。たとえば、LoggerFactoryがslf4jからのものである場合、Loggerはlog4jまたはJava.utilであってはなりません。それもslf4jからのものであることを確認してください。それでも問題が解決しない場合はお知らせください。

0
SHREYA PRASAD

Logbackクラスライブラリを使用して解決し、slf4jの使用を避けました。 slf4jは単なる抽象概念であり、使用する必要はありません。以下はコードスニペットです。

クラスの下にインポート

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;


LoggerContext context = new LoggerContext();
Logger logger = context.getLogger("testLogger");

どうぞ。ロガーとLoggerContextがあります。

0
Ankit Salunkhe