我有一些Java代码,希望将其转换为可以通过依赖项注入在Grails控制器和服务中使用的Bean。该代码基于此处的代码(作为独立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, String> { 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运行应用程序时,Grails崩溃,并显示一条很长的错误消息,提示它不能与空数据库一起使用。我不认为PersonRepository或graphDatabase都可以使用@Autowire。
所以问题是,要在Grails控制器或服务中将Bean内的Java代码(在src / java中)编写为Bean,我还需要做什么?
-根据示例代码编辑答案-
我怀疑该问题与Grails和Java代码混合在一起时组件扫描的工作方式有关。这也可能与在这种情况下创建bean的顺序以及幕后类的代理有关。
我进行了以下更改以使此工作:
我返回到neo4j xml配置,并添加了grails-app / conf / resources.xml和必要的neo4j配置。
从类中删除了@ EnableNeo4jRepositories批注
从Config.groovy中获取了语句-grails.spring.bean.packages = [‘grailsSdn4j’]
供其他参考,resources.xml中的neo4j配置如下所示:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:neo4j="http://www.springframework.org/schema/data/neo4j" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/data/neo4j http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd"> <context:spring-configured/> <context:annotation-config/> <neo4j:config storeDirectory="target/data/db" base-package="grailsSdn4j"/> <neo4j:repositories base-package="grailsSdn4j"/> </beans>