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

在使用解析器时,如何在graphql Spring Boot中引发多个验证错误?

米丰
2023-03-14

我正在使用graphql Spring Boot库,并使用解析器对象解析输入查询的值。

下面是一个例子:

@Component
public class BookResolver implements GraphQLQueryResolver {

    @Autowired
    private BookImpl bookImpl;

    @Autowired
    private GraphqlValidator validator;

    public GetBookOutput getBooks(GetBookQuery getBookQuery) {  

        validator.validateBookInputQuery(getBookQuery);

        GetBookOutput output = bookImpl.getBook(getBookQuery)

        return output;
    }
}

在上面的代码中,我想验证getBookQuery,并在发送给客户端的响应中引发自定义错误。输入的getBookQuery类型包含一个数字字符串

下面是我如何实现GraphqlValidator类:

@Component
public class GraphqlValidator {

    private static final String BOOK_NUMBER_REGEX = " *[0-9]+( *, *[0-9]+)* *";

    public void validateBookInputQuery(GetBookInputQuery getBookInputQuery) {
        String bookNumber = getBookInputQuery.getBookNumber();

        if (!isValidValueForRefVal(bookNumber, BOOK_NUMBER_REGEX)) {
            throw new GraphqlInvalidFieldException("Input type getBookInputQuery Invalid", "bookNumber", bookNumber);
        }
    }
}

在validateBookInputQuery函数中,我抛出了一个异常,该异常是从GraphQLError实现的:

@SuppressWarnings("serial")
public class GraphqlInvalidFieldException extends RuntimeException implements GraphQLError{

    private Map<String, Object> extensions = new HashMap<>();
    String message;

    public GraphqlInvalidFieldException(String message, String fieldname, String arg) {
        //super(message);
        this.message = message;
        extensions.put(fieldname, arg);
    }

    @Override
    public List<SourceLocation> getLocations() {
        return null;
    }

    @Override
    public Map<String, Object> getExtensions() {
        return extensions;
    }

    @Override
    public ErrorType getErrorType() {
        return null;
    }

    @Override 
    public String getMessage() {
        return message;
    }

}

通过这样做,我能够验证单个字段并向客户端发送自定义错误消息。但是,在更复杂的场景中,输入类型GetBookQuery不仅包含bookNumber,还包含bookName和作者。换句话说,输入字段将包含多个需要验证的字段。我希望能够验证所有字段,并将所有错误分组在一起,并一次将它们发送给客户端。有人能帮我吗?

共有1个答案

施恩
2023-03-14

您的验证程序可以在您运行验证时向列表中添加错误(字段和描述),然后将其传递到末尾的异常中,如果列表不是空的,则将抛出该异常。

 类似资料:
  • 问题内容: 我有一个已创建的公司类型。在该公司类型的内部,我有一个名为“摘要”的字段。如何在此字段中添加多个索引分析器? 我简要地研究了使用Yakaz插件,但似乎无法与NEST一起使用。 其背后的原因是,有时用户会在查询中搜索带有句点的公司名称,而其他时候则不包括句点。我想在公司名称上使用ngram进行部分匹配,带标点和不带标点。我目前正在使用停用词过滤器来删除标点符号。 摘要字段的属性(具有多个

  • 我想知道在使用CsvRoutines包时,是否有方法检查和验证字段。基本上,如果第一列只有数字,我想处理一行,否则跳过/可能抛出异常。我猜2.7.0中发布的@Validate annotation可以实现这一点。但我想知道,是否有其他方法可以在早期版本(如2.5.9)中实现同样的效果?

  • 我有通过ajax调用存储数据的数组索引。我只想对数组中的一个索引进行验证。这是我的代码。 我只需要验证为 来自前端的数组如下所示

  • 如果ExternalService.Get抛出异常而不是返回mono.error,则无法使其工作。总是建议使用try catch转换为mono/flow或者有没有更好的方法来验证这样的抛出异常?

  • 问题内容: 我有其他人编写的REST api,其中处理请求到特定url的方法接受一堆从路径参数填充的参数。 撰写此文章的人曾经使用过DropWizard,但我以前没有使用它的经验。我的任务是通过将其与db中的值进行比较来验证studentId字段。这将非常简单,但是我被告知要使用自定义验证程序来执行此操作。我对编写注释非常陌生,但经过大量挖掘后,这样编写了注释, 此后,我将注释添加到了要像这样运行

  • 我正在构建一个Spring Boot应用程序,并试图为我将在服务层验证的一些DTO/实体实现自定义验证。基于Spring关于这个问题的文档,我认为一种方法是实现org。springframework。验证。验证程序界面。 作为一个最小、完整、可重复的示例,请考虑以下代码: Spring初始化引导项目 在src/main/java/com中添加了以下代码。实例使用验证: 如果我点击endpoint触