当前位置: 首页 > 知识库问答 >
问题:

在图形 QL-SPQR 中返回错误的正确方法

郝玄天
2023-03-14

目前,我正在抛出RuntimeException以返回GraphQL验证错误。它工作得出奇的好,除了在我的日志中用大堆栈跟踪抛出可怕的错误。

在这里,您可以看到我正在检查提交的新用户注册突变,以确保密码相互匹配,并且电子邮件地址尚未使用。

在GraphQL SPQR Spring Boot Starter中,正确的方法是什么。

@GraphQLMutation (name="register")
public User register(@GraphQLArgument(name="firstname") String firstname, @GraphQLArgument(name="lastname") String lastname, @GraphQLArgument(name="email") String email, @GraphQLArgument(name="msisdn") String msisdn, @GraphQLArgument(name="password") String password, @GraphQLArgument (name="confirmPassword") String confirmPassword) {
    if (userRepo.findByEmail(email) != null) {
        throw new RuntimeException("User already exists");
    }

    if (!password.equals(confirmPassword)) {
        throw new RuntimeException("Passwords do not match");
    }

    User newUser = new User();
    //...
    return userRepo.save(newUser);
}

共有1个答案

东郭良弼
2023-03-14

我不清楚你在问什么...但是我会假设您想要定制要记录的内容。

对于初学者,我建议使用一种专用的异常类型,如验证例外,您可以以不同的方式捕获和处理。

至于日志记录,它可能发生在grapqh-java中,因为SPQR本身没有记录任何内容。默认情况下,graphql-java使用SimpleDataFetcherExceptionHandler记录字段解析期间捕获的异常。

您现在有几个选项,您可以在SPQR中注册一个ResolverInterceptor,它可以捕获验证异常并记录您想要的内容,并返回一个DataFetcherResult,其中包含用户的错误消息。因为没有验证异常冒泡到graph ql-java,所以DataFetcherExceptionHandler在这种情况下没有任何关系。

它看起来像:

public class ValidationInterceptor implements ResolverInterceptor {

    @Override
    public Object aroundInvoke(InvocationContext context, Continuation continuation) throws Exception {
        try {
            return continuation.proceed(context);
        } catch (ValidationException e) {
            log.warning(e);
            return DataFetcherResult.newResult()
                    .error(GraphqlErrorBuilder
                            .newError(context.getResolutionEnvironment().dataFetchingEnvironment)
                            .message(e.getMessage()) //the message for the user
                            .build());
        }
    }
}

查看此处的答案,了解如何使用Spring Boot注册定制拦截器。

另一种选择是替换数据取藏器例外处理程序图形ql-java使用。为此,您必须自己构造 GraphQL 对象并将其注册为 Bean。

@Bean
public GraphQL graphQL(GraphQLSchema schema) {
    GraphQL.Builder builder = GraphQL.newGraphQL(schema)
            .queryExecutionStrategy(new AsyncExecutionStrategy(customExceptionHandler))
            .mutationExecutionStrategy(new AsyncSerialExecutionStrategy(customExceptionHandler));
    return builder.build();
}

如果某处有一个Spring特性可以用于托管beans的异常处理,我也不会感到惊讶。

 类似资料:
  • 我已经将我的spring boot应用程序与graphql-spqr-spring-boot-starter https://github.com/leangen/graphql-spqr-spring-boot-starter集成在一起,我需要找到一种方法来禁用graph QL模式自省,因为这是生产中的一个安全问题。

  • 尝试实现reactive graph ql并遇到一些问题。 pom相关性, 架构:- 分解器:- 这里,如果我返回Flux或Mono,得到以下错误。 所以,尝试作为列表返回。 但是使用阻塞调用将Flux转换为List也会抛出错误, 这里,得到下面的错误。 使用graphiql进行测试。 http://localhost:8089/graphiql

  • 我正在使用库将现有的 Rest API 项目迁移到图形QL。我有一段代码,用于从获取当前的 : 但是,这将为图形 QL 返回空值。我认为这是正确的,因为对于 GraphQL,我们必须使用

  • 我的Kotlin Android应用程序有问题。到目前为止我还没有用Kotlin写过这么大的项目,所以我完全不知道出了什么问题。 当我试图启动我的应用程序时,我重新设置了一堵红线墙。我找到了一些解决方案(针对Java)并试图将它们实现到我的代码中,但没有奏效。 [FIXED]我修复了我的错误(在第一个注释中指出),并从片段xml中删除工具:context=“.mainactivity”

  • 问题内容: 我通过jQuery AJAX将一些数据发布到PHP脚本中,并且一切正常执行,但是返回了404错误。在我的Firebug控制台中,PHP脚本的响应是正确的。我不了解该脚本如何响应,它仍然会引发404错误。jQuery的“错误”回调方法将触发,而“成功”方法则不会触发。 PHP脚本执行的所有语句都能正常工作,因为我可以看到数据库正在更新等。 我在Dreamhost托管的WordPress

  • 我已经阅读了很多Java8可选版本,我确实理解这个概念,但在我的代码中尝试实现它时仍然会遇到困难。 虽然我在网上搜索了一些好的例子,但我没有找到一个解释得很好的例子。 我有下一个方法: 这个简单的方法通过传递文件路径来返回文件的md5。正如您所注意到的,如果文件路径不存在(或键入错误),将抛出NoSuchFileException,该方法返回Null。 我希望使用Optional,而不是返回nul