- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在我的项目中使用 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/
如果我所有的 Data Fetcher 都直接返回 POJO 而不是 CompletableFuture,那么整个 GraphQL 的执行会在同一个线程上发生吗? 最佳答案 是的。根据我从源代码中看到
我在数据库中收到一些奇怪的数据(嗯,它不符合我想要做的事情) 这是我的 for 循环,它以周为单位从 1 计数到 52,然后生成一个 URL,将其提供给函数进行处理 for ($week = 1; $
我知道如何retrieve a bean from a service in a datafetcher : public class MyDataFetcher implements DataFet
我计划在我的 Spring Boot 应用程序中实现 Graphql。我在 Google 上搜索了许多用 Java 设置 Graphql 服务器的站点,并找到了两种方法。 一个是像下面这样实现 Gra
我想写一段代码来处理像这样的 GraphQL 查询: query { group(id: "com.graphql-java") name(name: "graphql-j
我正在尝试像 REST API 客户端一样使用 GraphQL。我的后端返回 JSON,但在我的应用程序客户端中,我编写 graphQL,并在客户端中将 graphQL 查询转换为 HTTP 调用。
GraphQL 和 Java (Spring) 一团糟。有多个项目和多个示例,但完全不一致。 我理解 Spring Boot 应该提供 OOTB 工作解决方案,并且(在某种程度上)它是这样工作的。给你
我在我的项目中使用 Spring 和 graphql-java (graphql-java-annotation)。对于检索数据部分,我使用 DataFetcher 从服务(从数据库)获取数据。 奇怪
我是一名优秀的程序员,十分优秀!