【问题标题】:NoClassDefFoundError when using SimpleGraphQLServlet.Builder使用 SimpleGraphQLServlet.Builder 时出现 NoClassDefFoundError
【发布时间】:2018-09-27 17:48:33
【问题描述】:

我基于SimpleGraphQLServlet 类编写了一个简单的 GraphQL Servlet。此类的构造函数已弃用,建议改用生成器。所以我所做的是提供我自己的 servlet,它将请求转发到 SimpleGraphQLServlet 的实例,该实例可以在我的 servlet 的 init 方法中构建:

@WebServlet("/graphql")
public class GraphQLEndpoint extends HttpServlet {

    SimpleGraphQLServlet graphQLServlet;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        graphQLServlet.service(req, resp);
    }

    @Override
    public void init() throws ServletException {
        graphQLServlet = SimpleGraphQLServlet.builder(buildSchema()).withInstrumentation(new TracingInstrumentation()).build();
    }

    private GraphQLSchema buildSchema() { /* ... */ }
}

但是,在创建SimpleGraphQLServlet 实例时,会抛出以下异常:

java.lang.NoClassDefFoundError: graphql/execution/instrumentation/NoOpInstrumentation
        at graphql.servlet.SimpleGraphQLServlet$Builder.<init>(SimpleGraphQLServlet.java:134) ~[graphql-java-servlet-4.7.0.jar:na]

这很奇怪,因为该类似乎在 jar 文件graphql-java-8.0.jar 中可用。我声明了以下依赖项:

dependencies {
    compile "com.graphql-java:graphql-java:8.0"
    compile "com.graphql-java:graphql-java-tools:4.3.0"
    compile "com.graphql-java:graphql-java-servlet:4.7.0"

    compile "org.slf4j:slf4j-simple:1.7.25"

    testCompile "junit:junit:3.8.1"
    providedCompile "javax.servlet:javax.servlet-api:3.0.1"
}

我错过了什么?

【问题讨论】:

  • 尝试删除 compile "com.graphql-java:graphql-java-servlet:4.7.0" 既然你说它在 graphql-java-8.0.jar 中可用,你不需要声明两个依赖项。
  • @dimwittedanimal,感谢您的提示,但 graphql-java-8.0.jar 库中只有缺少的类,而 SimpleGraphQLServlet 包含在 graphql-java-servlet4.7.0.jar 库中。

标签: java graphql-java


【解决方案1】:

2020 答案:

implementation 'com.graphql-java-kickstart:graphiql-spring-boot-starter:5.10.0'
implementation 'com.graphql-java-kickstart:graphql-spring-boot-starter:5.10.0'
implementation 'com.graphql-java-kickstart:graphql-java-tools:5.6.1'

缺少那些依赖项

【讨论】:

    【解决方案2】:

    我确实收到了来自@kaqqao 的提示,他告诉我,我的例外是 graphql-java 版本不匹配。我使用的 8.0 版本还不兼容。

    现在我使用以下 graphql-java 依赖项,它工作正常:

    compile "com.graphql-java:graphql-java:7.0"
    compile "com.graphql-java:graphql-java-tools:4.3.0"
    compile "com.graphql-java:graphql-java-servlet:4.7.0"
    

    @kaqqao 以“覆盖依赖版本是可怕的事情”的评论结束。我同意;-)

    【讨论】:

    • 看到自己被这样引用真是太棒了:D 干杯!
    猜你喜欢
    • 2011-07-14
    • 2023-03-08
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多