在GraphiQL中显示GraphQL订阅结果

时间:2019-07-23 18:57:09

标签: java graphql vert.x

我正在尝试使用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());
}

为了达到这一目的,我已经使用以下来源作为参考:

0 个答案:

没有答案