【问题标题】:Grails @Autowire in Java class not workingJava类中的Grails @Autowire不起作用
【发布时间】: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?

【问题讨论】:

    标签: java spring grails spring-data spring-data-neo4j


    【解决方案1】:

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

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

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

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

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

    3. 从 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。感谢收看。
    猜你喜欢
    • 2017-04-08
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多