java - 将 bean 注入(inject)到 GraphQL 的 DataFetcher 中

标签 java spring graphql graphql-java

我在我的项目中使用 Spring 和 graphql-java (graphql-java-annotation)。 对于检索数据部分,我使用 DataFetcher 从服务(从数据库)获取数据。

奇怪的是:myService 总是null。有谁知道原因吗?

DataFetcher

@Component
public class MyDataFetcher implements DataFetcher {

    // get data from database
    @Autowired
    private MyService myService;

    @Override
    public Object get(DataFetchingEnvironment environment) {
        return myService.getData();
    }
}

架构

@Component
@GraphQLName("Query")
public class MyGraphSchema {

    @GraphQLField
    @GraphQLDataFetcher(MyDataFetcher.class)
    public Data getData() {
        return null;
    }
}

我的服务

@Service
public class MyService {

    @Autowired
    private MyRepository myRepo;

    @Transactional(readOnly = true)
    public Data getData() {
        return myRepo.getData();
    }
}

主要测试

@Bean
public String testGraphql(){
    GraphQLObjectType object = GraphQLAnnotations.object(MyGraphSchema.class);
    GraphQLSchema schema = newSchema().query(object).build();
    GraphQL graphql = new GraphQL(schema);

    ExecutionResult result = graphql.execute("{getData {id name desc}}");;
    Map<String, Object> v = (Map<String, Object>) result.getData();
    System.out.println(v);
    return v.toString();
}

最佳答案

由于在graphql-java-annotation中data fetcher是通过annotation定义的,它是由框架构造的(使用反射获取构造函数),因此它不可能是一个bean。

我找到的解决方法是将它设置为 ApplicationContextAware,然后我可以初始化一些静态字段而不是 bean。不是最好的东西,但它有效:

@Component
public class MyDataFetcher implements DataFetcher, ApplicationContextAware {

    private static MyService myService;
    private static ApplicationContext context;

    @Override
    public Object get(DataFetchingEnvironment environment) {
        return myService.getData();
    }

    @override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansExcepion {
        context = applicationContext;
        myService = context.getBean(MyService.class);
    }
}

基本上你仍然会得到一个由 graphQL 初始化的数据 getter 的新实例,但 spring 也会初始化它,并且由于 myService 是静态的,你会得到初始化的实例。

关于java - 将 bean 注入(inject)到 GraphQL 的 DataFetcher 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41440026/

相关文章:

java - JSP Scriptlet 与 MVC 在性能方面的比较

java - 如何通过Java中的构建模式创建GraphQL查询字符串?

java - 比较器不允许我比较 T 值

java - 在运行时配置实体

java - 检查 JSP 中的对象是否是新的或是否具有值

javascript - 如何使用 Vue.js 将用户登录到 spring-security 应用程序?

spring - CryptoServicesRegistrar.isInApprovedOnlyMode() 和 CryptoServicesRegistrar.setApprovedOnlyMode(true) 已在充气城堡中删除

java - LiquiBase 和 Spring boot - 缺少序列

python - 如何在 graphene-django GraphQLTestCase 中使用 django-grahql-jwt 进行身份验证?

javascript - 使用Facebook的DataLoader传递参数