2016-05-19 11 views
0

私はフロントエンド用のSpringbootと共にSnarl APIを介してStardogデータベースに接続するアプリケーションを構築しています。 snarlTemplateのautowired beanは正常に動作していますが、私が定義したコンポーネントはすべて問題があります。私はValidationDAOのautowiringを取り出してロードしました。私はこの同じ問題で他の投稿を見てきましたが、私は解決策を得ることができませんでした。

まずは、DAO(これはコンポーネントとして注釈を付けました)です...検証は、別のファイルで定義されたPOJOです。
のsrc /メイン/ javaの/検証/ ValidationDAO.javaそしてここAutowired依存関係の注入が失敗しました - フィールドの自動転送ができません(Spring)

@ComponentScan("com.complexible.stardog.ext.spring") 
@Component 
public class ValidationDAO { 

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

    @Autowired 
    public SnarlTemplate snarlTemplate; 

    public List<Validation> validate() { 

     // TODO: file input 

     String query = "SELECT * WHERE { ?s ?p ?o }"; 

     logger.debug("DAO Query: " + query); 
     List<Validation> results = snarlTemplate.query(query, new RowMapper<Validation>() { 

      public Validation mapRow(BindingSet bindingSet) { 
       Validation v = new Validation(); 

       // set results of query 
       v.setSubject(bindingSet.getValue("s").stringValue()); 
       v.setPredicate(bindingSet.getValue("p").stringValue()); 
       v.setObject(bindingSet.getValue("o").stringValue()); 

       // set error message 
       v.setError("No given description."); 

       return v; 
      } 
     }); 

     return results; 
    } 

    public SnarlTemplate getSnarlTemplate() { 
     return snarlTemplate; 
    } 

    public void setSnarlTemplate(SnarlTemplate snarlTemplate) { 
     this.snarlTemplate = snarlTemplate; 
    } 

} 

とにHomeControllerです:
のsrc /メイン/ javaの/検証/ HomeController.java

@RestController 
public class HomeController { 

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

    @Autowired 
    public ValidationDAO validationDAO; 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String home(Locale locale, Model model) { 

     List<Validation> results = validationDAO.validate(); 
     logger.debug("Found " + results.size() + " errors in ontology."); 
     model.addAttribute("results", results); 
     return "home"; 

    } 

    public ValidationDAO getValidationDAO() { 
     return validationDAO; 
    } 

    public void setValidationDAO(ValidationDAO validationDAO) { 
     this.validationDAO = validationDAO; 
    } 

} 

ルートコンテキスト:
src/main/webapp/WEB-INF/spring/root-context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <context:component-scan base-package="src.main.java.validation"/> 
    <context:annotation-config/> 

    <bean name="dataSource" class="com.complexible.stardog.ext.spring.DataSourceFactoryBean"> 
     <property name="to" value="validationTest"/> 
     <property name="username" value="admin"/> 
     <property name="password" value="admin"/> 
     <property name="url" value="snarl://localhost:5820"/> 
    </bean> 

    <bean name="template" class="com.complexible.stardog.ext.spring.SnarlTemplate"> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 

</beans> 

最後に、完全なエラーメッセージです。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public validation.ValidationDAO validation.HomeController.validationDAO; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'validationDAO': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public com.complexible.stardog.ext.spring.SnarlTemplate validation.ValidationDAO.snarlTemplate; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.complexible.stardog.ext.spring.SnarlTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
    at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
    at validation.Application.main(Application.java:14) [main/:na] 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: public validation.ValidationDAO validation.HomeController.validationDAO; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'validationDAO': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public com.complexible.stardog.ext.spring.SnarlTemplate validation.ValidationDAO.snarlTemplate; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.complexible.stardog.ext.spring.SnarlTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    ... 17 common frames omitted 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'validationDAO': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public com.complexible.stardog.ext.spring.SnarlTemplate validation.ValidationDAO.snarlTemplate; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.complexible.stardog.ext.spring.SnarlTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    ... 19 common frames omitted 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: public com.complexible.stardog.ext.spring.SnarlTemplate validation.ValidationDAO.snarlTemplate; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.complexible.stardog.ext.spring.SnarlTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    ... 30 common frames omitted 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.complexible.stardog.ext.spring.SnarlTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
    ... 32 common frames omitted 

答えて

2

ComponentScanアノテーションは、コンポーネントクラス内ではなくコンフィグレーション内にある必要があります。私は本当にそれがすべて動作し、あなたが言及していないパッケージが含まれている場合は本当に知りません。

第2ポイント:フィールド注入を使用しないでください。 (http://olivergierke.de/2013/11/why-field-injection-is-evil/

ここまで問題に戻る:xmlファイルのコンポーネントスキャンが間違っているか、パッケージに混乱を招く名前があると思います。しかし、これはあなたのmaven/gradleファイルパスであると確信しています;)ファイルパスは含まず、パッケージvalidationのみを含むべきです。

<context:component-scan base-package="validation"/><context:annotation-config/> 
+0

にはどうすればいいの構成でComponentScanを設定するのでしょうか?これは設定Javaファイルですか?申し訳ありませんが、注釈は私には新しく、私はそれらを間違って使用していると確信しています。また、私はパッケージの "検証"を試みたが、それでも失敗しました。 –

+0

あなたはSpringBootを使用しているので、あなたはエントリポイントクラス(スプリングブートアプリケーションを起動するクラス)に '@ ComponentScan'アノテーションを適用することから始めることができます。ページの最後のサンプル:http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-structuring-your-code.html – meistermeier

+0

ああ!それは多くの意味があります。それはまだ実行されていないので、私は戻ってすべてを再構築する必要があります。私は問題がXMLにあると思うので、それを試して削除し、春の設定ですべてを行うかもしれません。 –

0
+0

ValidationDAOからautowiringを削除したときに、Snarlテンプレートがロードされたので、私はそう信じています。XML設定を取り除いて@Configurationクラスを行うほうがよいと思いますか? –

+0

個人的に私は注釈のみの設定の巨大なファンではありません。 さまざまな設定に応じて、注釈が付けられ、インターフェイスの実装を変更するには非常に複雑なすべてのクラスを追跡することは困難です。 変更できないものに対しては注釈を使用し、設定可能なものについてはXMLを使用します。 私の製品構成は1つのファイルになっています。 – Maxvader

+0

私はいくつかのテストを行い、モッククラスを使って構成を構築しました。 私にはxmlが決して読まれないようです。 @SpringBootApplicationクラスのConfigurationアノテーションを移動するだけで、魔法が実行されました。 – Maxvader

関連する問題