我基于类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"
}


我错过了什么?

最佳答案

我确实从@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以“覆盖依赖版本是令人恐惧的业务”的注释结束。我同意 ;-)

关于java - 使用SimpleGraphQLServlet.Builder时出现NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49883550/

10-11 00:03