Java类中的Grails @Autowire不起作用
Posted
技术标签:
【中文标题】Java类中的Grails @Autowire不起作用【英文标题】:Grails @Autowire in Java class not working 【发布时间】:2015-01-09 18:11:12 【问题描述】:我有一些 Java 代码,我想通过依赖注入将其转换为可在 Grails 控制器和服务中使用的 Bean。该代码基于 here(作为独立 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。
所以问题是,我还需要做些什么才能将使用 Java 代码(在 src/java 中)编写为 Grails 控制器或服务中的 Bean?
【问题讨论】:
【参考方案1】:-- 根据示例代码编辑答案--
我怀疑这个问题与组件扫描如何与 Grails 和 Java 代码混合在一起工作有关。它也可能 与在这种情况下创建 bean 的顺序和幕后类的代理有关。
我做了以下更改来完成这项工作:
我回到 neo4j xml 配置并添加了带有必要 neo4j 配置的 grails-app/conf/resources.xml。
从类中移除了@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>
【讨论】:
谢谢,GraphDatabase bean 不是由我提供/编写的;它是 spring-data-neo4j 的一部分。我尝试将各种东西放入resources.groovy,例如beans = graphDatabase(GraphDatabase) ,但没有成功。您对尝试什么有什么建议吗? 我根据您的评论和上面发布的代码更新了我的答案。基本上,graphDatabase 被正常注入到您的 Java 代码(Spring DI)中,然后您在 grails 应用程序上下文中注册您的 POJO(WannabeABeanDB)。 不,我可以让 WannabeABeanDB 加载到 Grails 中。失败的是“@Autowired GraphDatabase graphDatabase;”声明:graphDatabase 保持为空。您的回答帮助我在其他地方解决了另一个问题(谢谢!),但遗憾的是它并没有解决这个问题。 所以graphDatabase bean 将由Spring 创建和注入?看起来@EnableNeo4jRepositories 注释将扫描基本包“hello”以查找存储库并自动生成实现。我猜想注解和扫描在 Spring Java 应用程序中的工作方式与您的 grails 应用程序的工作方式并不完全相同。如果我们能够弄清楚应该如何创建该 bean,那么我们就可以找到解决这个问题的方法。如果可以把你的代码放在github上,我今天晚些时候可以看看。 我已将代码放在 github 上:github.com/johnlondon/grailsSdn4 我这辈子都无法弄清楚我需要做什么才能让 @Autowired 语句正常工作。您可以提供的任何建议将不胜感激 - 我相信其他人希望能够使用 spring-data-neo4j 和 Grails。感谢收看。以上是关于Java类中的Grails @Autowire不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Spring Autowire Hashmap 在 kotlin 中不起作用