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 = ['grailsS​​dn4j']

供他人参考,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 中不起作用

grails域类中的时间字段

Grails 多列索引

更新 Grails 中父域类中的“lastUpdated”字段

启用 Hystrix 后 Autowire 不起作用

grails中的列类型不起作用