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

如何自定义GraphQL查询验证错误消息

勾海超
2023-03-14

我在数据库上实现查询层,使用GraphQl和Spring Boot项目在sql数据库上执行CRUD操作。在GraphQL模式中,我提到了一些必须的字段,当这些字段在查询中没有提到时,它会以默认格式返回200状态代码的ValidationError错误消息。

错误:

{
"data": null,
"errors": [
    {
         value=StringValue{value='1235'}}]}}]}' is missing required fields '[book_type]' @ 'create_book'",
        "locations": [
            {
                "line": 3,
                "column": 23,
                "sourceName": null
            }
        ],
        "description": "argument 'insert' with value value=StringValue{value='1235'}}]}}]}' is missing required fields '[book_type]'",
        "validationErrorType": "WrongType",
        "queryPath": [
            "create_book"
        ],
        "errorType": "ValidationError",
        "path": null,
        "extensions": null
    }
],
"dataPresent": false,
"extensions": null
}

这是我的代码与层架构模式

控制器:

@Autowired
private GraphQLServer graphQlServer;

@PostMapping("test")
public ResponseEntity<Object> graphQl(@RequestBody String body){
    ExecutionResult response = graphQlServer.execute(body);

    return ResponseEntity.ok(response);
}

服务:

@Service
public class GraphQLServer {

@Autowired
private GraphQL graphQl;

public ExecutionResult execute(String query) {
    return graphQl.execute(query);
   }

}

配置:

@Bean
public GraphQL loadSchema() throws IOException {

    File schemaFile = schemaResource.getFile();

    TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(schemaFile);
    RuntimeWiring wiring = buildRuntimeWiring();
    GraphQLSchema schema = new SchemaGenerator().makeExecutableSchema(typeRegistry, wiring);
    return GraphQL.newGraphQL(schema).build();
}

private RuntimeWiring buildRuntimeWiring() {

    return RuntimeWiring.newRuntimeWiring()
            .type("Mutation", mutationWiring -> mutationWiring.dataFetcher("create_book", bookDataFetcher))
            .build();

}

BookDataFetcher:

@Override
public Map<String, Object> get(DataFetchingEnvironment environment) {

    //return data from db by getting Map properties from environment

}

上面的代码按预期工作,但我这里的问题是如何自定义错误消息?在错误消息中,我想提及状态400,因为这是来自客户端的错误请求

共有1个答案

殳智志
2023-03-14

首先,您应该在ExecutionResult上调用toSpecification(),以确保响应符合GraphQL规范。

默认情况下,graphql java只提供一个ExecutionResult的实现,即ExecutionResultImpl,因此您可以将ExecutionResult强制转换为它,以便使用它的transform()更新其状态。

ExecutionResultImpl内部包含graphql java检测到的所有错误。它们都在GraphQLError的子类中,这意味着您必须在定制期间将其强制转换为特定的子类。

在您的例子中,子类是ValidationError,代码如下所示:

@PostMapping("test")
public ResponseEntity<Object> graphQl(@RequestBody String body){

    ExecutionResult response = graphQlServer.execute(body);

    ExecutionResultImpl responseImpl = (ExecutionResultImpl) response;

    List<GraphQLError> customizedErrors = Lists.newArrayList();
    for (GraphQLError gqlError : responseImpl.getErrors()) {
            //Do your error custmosation here....
            GraphQLError customizedError = gqlError;
            if (gqlError instanceof ValidationError) {
                ValidationError error = (ValidationError) gqlError;
                customizedError = new ValidationError(error.getValidationErrorType(), error.getLocations(),
                        "Customizing some error message blablabla....");
            }
            customizedErrors.add(customizedError);
    }

    Map<String, Object> specResponse = responseImpl.transform(b->b.errors(customizedErrors)).toSpecification();

    return ResponseEntity.ok(specResponse);
}
 类似资料:
  • 问题内容: 我想自定义弹簧验证错误 但是我做不到。要采取的步骤是什么? 问题答案: 该JSR 303的默认邮件插补算法,您可以通过提供捆绑命名的资源来定制信息。在类路径中创建一个文件,其中包含: 这将更改@Size约束的默认消息,因此您应该使用@Size约束而不是特定于Hibernate的@Length约束。 您可以更改特定约束实例的消息,而不是更改所有约束的默认消息。message在约束上设置属

  • 我正在一个简单的Java程序中测试图-spqr天秤座。 这是我目前所做的: 然后,我在main方法中调用构建GraphQL方法 我有错误:查询无法验证:“{status(id:123){status}}” 怎么了?

  • 当我们在OSB 12c中添加Validate Node以根据XSD验证传入请求时,如果验证失败,则在某些错误消息中会显示导致验证错误的字段名。但仅对于十进制值,错误消息只显示Invalid decimal Value,而没有提及引发错误的字段。我们能克服这个问题吗

  • 我正在尝试在laravel中编写用于验证的自定义消息。我在网上查过,看到一些帖子,其他人通过添加一个受保护的函数来解决同样的问题。我还向代码中添加了该函数,但它不起作用。这是我的代码这是myFormController.php: 公共函数请求(注册请求$request){$validated=$request- 这是RegistrationRequest.php: 使用Illumb\Contrac

  • 我在Codeigniter中为表单验证创建了一个自定义函数。它连接到URL帮助器,我通过制作MY_URL_帮助器实现了这一点。 助手修改: 我如何称呼验证: 美元这个- 语言文件: 但是提交表单时不会显示任何错误信息。如果我将valid_url函数更改为true和false,它将执行该函数。所以它运行这个函数。 如何使错误消息出现?

  • 我创建了一个Django表单: 在模型中,定义为 如果用户为宽度输入0,则Django在表单验证时返回的错误消息为 确保该值大于或等于0.05。 因此,它很好地包含了来自的值。我想把它改为“相对宽度必须是” 为了实现这一点,我尝试在addFaceForm Meta中自定义错误 但这意味着要硬编码0.05的值。我想从模型定义中读一下。如何做到这一点?