我正在尝试使用Java / Vert.x获得GraphQL订阅,并在GraphiQL中显示结果。我在控制台中看到了所有System.out.println语句,但是GraphiQL没有显示任何结果,因为服务器正在生成“内部服务器错误”消息。
模式:
type Subscription {
test: String
}
Vert.x顶点
private RuntimeWiring getRuntimeWiring() {
return new RuntimeWiring()
.type("Subscription", builder -> builder
.dataFetcher("test", getTestDataFetcher()))
.build();
}
private VertxDataFetcher<Publisher<String>> getTestDataFetcher() {
return new VertxDataFetcher<>((env, future) -> future.complete(doTest()));
}
private Publisher<String> doTest() {
AtomicReference<Subscription> ar = new AtomicReference<>();
Observable<String> obs = Observable.just("Hello");
Publisher<String> pub = obs.toFlowable(BackpressureStrategy.BUFFER);
pub.subscribe(new Subscriber<String>() {
@Override
public void onSubscribe(Subscription s) {
System.out.println("SUBSCRIBE");
ar.set(s);
s.request(1);
}
@Override
public void onNext(String s) {
System.out.println("NEXT="+s);
ar.get().request(1);
}
@Override
public void onError(Throwable t) {
System.out.println("ERROR");
}
@Override
public void onComplete(){
System.out.println("COMPLETE");
}
}
return pub;
}
如果我使用GraphiQL运行订阅并在vert.x服务器控制台上查看,则控制台上的输出为:
SUBSCRIBE
NEXT=Hello
COMPLETE
GraphiQL输出窗口显示“内部服务器错误”,并从服务器发送了500错误代码
如果我将DataFetcher修改为第一个链接底部显示的内容,则还会收到“内部服务器错误”。
private DataFetcher<Publisher<String>> getTestDataFetcher() {
return env -> doTest();
}
我在vertx控制台中看不到任何针对500错误的堆栈跟踪。所以也许这是一个错误?
侧注-如果我尝试如下所示使用CompletionStage(基于第二个链接的底部),则会收到一条错误消息,内容为:“在使用graphql订阅时,数据获取程序必须返回事件的发布者”
private DataFetcher<CompletionStage<String>> getTestDataFetcher() {
Single<String> single = Single.create(emitter -> {
new Thread(()-> {
try {
emitter.onSuccess("Hello");
} catch(Exception e) {
emitter.onError(e);
}
}).start();
)};
return environment -> single.to(SingleInterop.get());
}
为了达到这一目的,我已经使用以下来源作为参考: