小编典典

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

java

我有一些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,我还需要做什么?


阅读 209

收藏
2020-11-30

共1个答案

小编典典

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

我怀疑该问题与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配置如下所示:

<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>
2020-11-30