2013-06-06 39 views
8

varargs SLF4J về các cuộc gọi đăng nhập là khá hữu ích trong công việc của tôi JavaLàm cách nào để tận dụng việc ghi nhật ký SLF4J trong khung công tác Play2.1?

Logger log = LoggerFactory.getLogger(getClass()); 
log.debug("Hello, {}. The current time is {}", "robert", new Date()); 

Cố gắng để làm ví dụ đơn giản này trong Chơi 2.1 Khung/Scala và tôi chạy vào trình biên dịch từ chối tôi.

import play.api._ 
import play.api.mvc._ 
import org.slf4j.LoggerFactory 

object Application extends Controller { 
    val log: org.slf4j.Logger = LoggerFactory.getLogger(getClass()) 

    def hb = Action { 
    val message = makeMessage() 
    // COMPILER HATES THIS: ambiguous reference compiler error here 
    log.info("Hello {}. The current time is {}", "robert", new java.util.Date()) 
    Ok(message) 
    } 
    def makeMessage(): String = { return "stuff" } 
} 

[dm2-server] $ compile 
[info] Compiling 2 Scala sources to /Users/bobk/work/dm2-server/target/scala-2.10/classes... 
[error] /Users/bobk/work/dm2-server/app/controllers/Application.scala:16: ambiguous reference to overloaded definition, 
[error] both method info in trait Logger of type (x$1: String, x$2: <repeated...>[Object])Unit 
[error] and method info in trait Logger of type (x$1: String, x$2: Any, x$3: Any)Unit 
[error] match argument types (String,String,java.util.Date) 
[error]  log.info("Hello {}. The current time is {}", "robert", new java.util.Date()) 
[error]  ^
[error] one error found 
[error] (compile:compile) Compilation failed 
[error] Total time: 1 s, completed Jun 6, 2013 10:54:41 AM 

Lỗi đó là gì và làm cách nào để khắc phục nó để gọi đến API SLF4J? Nếu tôi không thể làm điều đó, làm cách nào tôi có thể sử dụng Khung ghi nhật ký Play 2.1 để nhận các vararg trong các cuộc gọi đăng nhập của mình? Có điều gì đó không đúng ở vùng đất Scala.

Trả lời

6

Bạn đang sử dụng phiên bản SLF4J nào? Nếu bạn có thể quay lại phiên bản 1.6.6 hoặc mới hơn, bạn có thể tránh vấn đề này trong sự mơ hồ. Hai chữ ký không may trông giống hệt với scala và trình biên dịch dường như không thể phân biệt được ý nghĩa của bạn. Đề xuất chung là quay trở lại phiên bản SLF4J (nếu có thể cho bạn), nơi sự mơ hồ của phương thức quá tải này sẽ không tồn tại. Thông tin thêm có thể được tìm thấy tại các liên kết dưới đây:

https://groups.google.com/forum/?fromgroups#!topic/scala-language/ms4IVIu-xGw

https://github.com/typesafehub/scalalogging/issues/16

+0

Câu trả lời hay. Quay trở lại không phải là một lựa chọn cho tôi. Rock: Hard Place. Có vẻ như tôi phải từ bỏ API của SLF4J và nhận được varargi-ness của tôi từ String.format của Scala. Tôi đã thực hiện các tiêu chuẩn trong quá khứ của SLF4J "{}" so với String.format của Java và SL4J xuất hiện trên đầu trang. Quá tệ tôi dường như bị mắc kẹt với con đường có hiệu suất thấp nhất. Có lẽ thời gian của mình để chạy lại các tiêu chuẩn để xem nếu nó thực sự là xấu. –

1

"quick sửa chữa" cho điều này là như sau:

Chỉ cần buộc các đối số cuối cùng là gõ Bất kỳ và giải quyết vấn đề của trình biên dịch (và làm cho mã hơi ít hơn ...)

logger.debug("hello {}/{} ", "Hello", "World":Any) 

Hoặc trong trường hợp của bạn:

log.info("Hello {}. The current time is {}", "robert", new java.util.Date():Any) 
Các vấn đề liên quan