2017-02-15 3 views
0

構成クラスを使用してSpringブートアプリケーションを作成しました。スプリングライブラリを使用するのは通常のRestAPIです。その内部では、自分のLoggerクラスを使用してすべてのアクションを記録します。スプリングブートが開始されません - 豆の間に循環依存があります

また、アプリケーションクラスには、主な機能であるapplication.propertiesが含まれています。 xmlにBeanはありません.Configurationクラス内のものだけです。ここで

はその構成です:

@SpringBootConfiguration 
public class ApplicationConfiguration { 

@Value("${hibernate.dialect}") 
private String dialect; 
@Value("${hibernate.show_sql}") 
private String showSql; 
@Value("${hibernate.mappingResources}") 
private String[] mappingResources; 
@Value("${jdbc.driverClassName}") 
private String driverClassName; 
@Value("${jdbc.url}") 
private String url; 
@Value("${jdbc.username}") 
private String username; 
@Value("${jdbc.password}") 
private String password; 

@Autowired 
private DataSource dataSource; 
@Autowired 
private LocalSessionFactoryBean localSessionFactoryBean; 

@Bean 
public LocalSessionFactoryBean localSessionFactoryBean() { 
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); 
    sessionFactoryBean.setDataSource(dataSource); 
    Properties hibernateProperties = new Properties(); 
    hibernateProperties.setProperty("hibernate.dialect", dialect); 
    hibernateProperties.setProperty("hibernate.show_sql", showSql); 
    sessionFactoryBean.setHibernateProperties(hibernateProperties); 
    sessionFactoryBean.setMappingResources(mappingResources); 
    return sessionFactoryBean; 
} 

@Bean 
public DataSource dataSource() { 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    dataSource.setDriverClassName(driverClassName); 
    dataSource.setUrl(url); 
    dataSource.setUsername(username); 
    dataSource.setPassword(password); 
    return dataSource; 
} 

} 

はまた、私はロガークラスを作成しました:

@Service 
public class LinksLogger { 

private static final Logger logger = Logger.getLogger("MyLogs"); 

// methods here... 

} 

ここで私は私のロガーを使用する方法:

@RestController 
@RequestMapping("/api/v1") 
public class HelloController { 

@Autowired 
private LinksLogger logger; 

@RequestMapping(value = "/hello", method = RequestMethod.GET) 
public Map<String, String> hello() { 
    Map<String, String> data = new HashMap<>(); 
    data.put("data", "Hello#_#World"); 
    logger.log("Hello#_#World"); 
    return data; 
} 
} 

は右、オーケーのように見えますか?

There is a circular dependency between 2 beans in the application context: 
- helloController (field private com.defaultxyz.linksapi.util.LinksLogger com.defaultxyz.linksapi.controller.HelloController.logger) 
- applicationConfiguration (field private org.springframework.orm.hibernate3.LocalSessionFactoryBean com.defaultxyz.linksapi.util.ApplicationConfiguration.localSessionFactoryBean) 
- localSessionFactoryBean 

はなぜ、この例外が表示されます:私は私のコードをコンパイルするとき しかし、私は例外を得ましたか。私がコードで間違ったことは?

答えて

4

インスタンス化されたクラスで@Autowire Beanをしようとしています。

@Autowired 
private DataSource dataSource; 
@Autowired 
private LocalSessionFactoryBean localSessionFactoryBean; 

しかし、あなたはまた、彼らは同じクラスで作成されているので、容器がautowired分野でそれらを注入することはできません、@Beanとしてこれらを定義します。 @Autowiredフィールドを削除し、必要に応じてメソッドを使用します。代わりに

sessionFactoryBean.setDataSource(dataSource); 
+1

感謝の

sessionFactoryBean.setDataSource(dataSource()); 

!それは動作し、私はその練習を覚えています! :) – DefaultXYZ

関連する問題