我在用着Spring& graphql-java (graphql-java-注释)在我的项目中。
为了检索数据部分,我使用 DataFetcher 从服务(从数据库)获取数据。
奇怪的是:myService
总是null。有人知道原因吗?
数据获取器
@Component
public class MyDataFetcher implements DataFetcher {
// get data from database
@Autowired
private MyService myService;
@Override
public Object get(DataFetchingEnvironment environment) {
return myService.getData();
}
}
Schema
@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 中,数据获取器是通过注释定义的,因此它是由框架构造的(使用反射来获取构造函数),因此它不能是 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 初始化的数据获取器的新实例,而且 spring 也会初始化它,并且因为myService
是静态的,你会得到初始化的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)