Grails @Autowire在Java类中无法正常工作

我有一些Java代码,我想变成一个Bean,可以通过dependency injection在Grails控制器和服务中使用。 代码基于此处 (在作为独立Java应用程序运行时可以正常工作)。

具体来说,我有:

// WannabeABeanDB.java package hello; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.factory.GraphDatabaseFactory; import org.neo4j.kernel.impl.util.FileUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.neo4j.config.EnableNeo4jRepositories; import org.springframework.data.neo4j.config.Neo4jConfiguration; import org.springframework.data.neo4j.core.GraphDatabase; import java.io.File; @Component @Configuration @EnableNeo4jRepositories(basePackages = "hello") public class WannabeABeanDB extends Neo4jConfiguration { public WannabeABeanDB() { setBasePackage("hello"); } @Bean GraphDatabaseService graphDatabaseService() { return new GraphDatabaseFactory().newEmbeddedDatabase("accessingdataneo4j.db"); } @Autowired PersonRepository personRepository; @Autowired GraphDatabase graphDatabase; public String testThatWeCanAccessDatabase() throws Exception { Person greg = new Person("Greg"); Transaction tx = graphDatabase.beginTx(); try { personRepository.save(greg); greg = personRepository.findByName("Greg").toString(); tx.success(); } finally { tx.close(); } return greg.name; } } // Person.java package hello; import java.util.HashSet; import java.util.Set; import org.neo4j.graphdb.Direction; import org.springframework.data.neo4j.annotation.Fetch; import org.springframework.data.neo4j.annotation.GraphId; import org.springframework.data.neo4j.annotation.NodeEntity; import org.springframework.data.neo4j.annotation.RelatedTo; @NodeEntity public class Person { @GraphId Long id; public String name; public Person() {} public Person(String name) { this.name = name; } public String toString() { return this.name; } } // PersonRepository.java package hello; import org.springframework.data.repository.CrudRepository; public interface PersonRepository extends CrudRepository { Person findByName(String name); } 

所以现在我想从控制器使用:

 // TestController.groovy package hello import hello.WannabeABeanDB class TestController { WannabeABeanDB graph def index() { render graph.test() } } 

我已经设置(在Config.groovy中):

 grails.spring.bean.packages = ['hello'] 

但是,当我执行grails run-app时,Grails会崩溃并显示一条非常长的错误消息,指出它无法使用null数据库。 我不相信@Autowire被选为PersonRepository或graphDatabase。

所以问题是,我还需要做些什么才能在Grails控制器或服务中编写使用Java代码(在src / java中)作为Bean?

– 根据示例代码编辑答案 –

我怀疑这个问题与组件扫描如何与Grails和Java代码混合在一起有关。 它可能还与在这种情况下创建bean的顺序和幕后类的代理有关。

我做了以下更改来完成这项工作:

  1. 我回到neo4j xml配置并添加了grails-app / conf / resources.xml以及必要的neo4j配置。

  2. 从类中删除了@ EnableNeo4jRepositories注释

  3. 从Config.groovy中取出声明 – grails.spring.bean.packages = [‘grailsS​​dn4j’]

对于其他人的参考,resources.xml中的neo4j配置如下所示: