2014-10-22 2 views
6

То, что я хочу, - это сделать весной autowire регистратором. То есть, другими словами, я хочу, чтобы иметь эту работу:Как вставить регистратор в поле в примерном загрузочном приложении весны?

import javax.servlet.http.HttpServletResponse; 

import org.slf4j.Logger; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 

@Controller 
public class MainController { 

    @Autowired 
    private Logger logger; 

    @RequestMapping("/") 
    public String enterSite(HttpServletResponse response) { 
     logger.info("site entered"); 
     return "welcome"; 
    } 
} 

Сейчас это вызывает исключение при запуске: «Нет квалификационную боб типа [org.slf4j.Logger] нашел для зависимости ...».

Мои pom.xml зависимости:

<parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.2.0.M1</version> 
     <relativePath /> <!-- lookup parent from repository --> 
    </parent> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-rest</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-actuator</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-jasper</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>9.1-901.jdbc4</version> 
     </dependency> 
     <!-- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> 
      </dependency> --> 
    </dependencies> 

Я прочитал это

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-logging

Он говорит, что если вы используете один из стартовых POMS (я) Logback используется - но для внутреннего Ведение журнала. Может ли это быть аутоуправляемым в моих классах?

ответ

8

Хотя это не обычный способ, которым Вы можете добавить регистратор боб прямо в своем контекст воспроизведения классических привязок:

private final Logger logger = LoggerFactory.getLogger(MainController.class); 

просто вставив в контексте пружинного:

<bean id="logger" scope="prototype" class="org.slf4j.LoggerFactory" factory-method="getLogger"> 
    <constructor-arg name="name" value="youLoggerName" /> 
</bean> 

, то вы можете просто вводить свой регистратор:

@Autowired 
private Logger logger; 
+0

Если мы создадим регистратор через bean-компонент, он не будет доступен в конечных точках регистратора привода. Таким образом, я не могу настроить время выполнения регистрации. Есть ли способ, чтобы он был доступен в конечных точках регистратора привода? – Nitul

5

Вы можете иметь Spring autowire экземпляр Logger, но это было бы очень необычно, что нужно сделать (вам понадобится фасоль типа Logger быть в контексте приложения). Гораздо более обычный подход к инициализации регистратора, где она объявлена, настраивая его с классом, который будет использовать его для регистрации:

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class MainController { 

    private final Logger logger = LoggerFactory.getLogger(MainController.class); 

} 
+2

Не отвечает на вопрос, и призывает используя плохое поведение в контексте DI. –

8

Если цель здесь - сокращение кода, попробуйте Project Lombok. Тогда вам даже не нужно объявлять регистратор - просто добавить аннотацию и использовать log вместо logger

Таким образом, ваш приведенный выше код будет выглядеть следующим образом:

import javax.servlet.http.HttpServletResponse; 

import org.slf4j.Logger; 
// import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 

import lombok.extern.slf4j.Slf4j; 

@Slf4j 
@Controller 
public class MainController { 

    @RequestMapping("/") 
    public String enterSite(HttpServletResponse response) { 
     log.info("site entered"); 
     return "welcome"; 
    } 
} 
Смежные вопросы