java.lang.String 无法转换为 org.slf4j.Marker

8

我正在使用import lombok.extern.slf4j.Slf4j;来为我的类提供日志功能,这是我的日志语句:log.info("{} : {} - {}", String1, String2, String3);

但它无法编译,并抱怨上述行:java.lang.String cannot be converted to org.slf4j.Marker

有什么想法吗?

3个回答

4
我猜想您希望使用info(String format, Object... arguments),并且想知道为什么实际调用的方法是info(Marker marker, String format, Object arg1, Object arg2)
这与最具体方法选择确定可能适用的方法有关。
由于您恰好有四个参数,其中三个完全匹配,因此info(Marker marker, String format, Object arg1, Object arg2)方法必须被视为“可能匹配”。
您应该阅读有关可变元参数的文档以获取更多详细信息。

0
在我的情况下,IntelliJ错误地选择了“slf4j-api-1.6.1.jar”这个Jar包,而我希望我的代码使用的是“slf4j-api-1.7.10.jar”。
SLF4J FAQ中有一个简短(但比较微妙)的讨论,解释了为什么会出现这种情况。更改的背后思想是Log4J的创造者使Log4J使用标记对象代替字符串,而之前的 Beta 版本只使用对象。似乎他们将其更改为更宽松的形式。接受的答案指出,当类路径中存在错误的 Jar 包时,会选择错误的方法调用。
如果您正在使用 Lombok,情况会更加混乱,因为@ Slf4j注释会干扰此处使用的类型。
一旦我从类路径中删除了1.6.1的Jar包,并换成了1.7.10的Jar包,编译就重新开始工作了。

0

我刚遇到了这个问题。我理解了问题,谢谢Kraal,但是像下面这样的解决方法会很有帮助。

log.info("{} : {} - {}", 
    new Object[] {String1, String2, String3});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接