我正在使用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和Author。换句话说,输入字段将包含多个需要验证的字段。我希望能够验证所有字段,并将所有错误分组在一起,并立即将它们发送到客户端。有谁能帮我一下吗?
https://stackoverflow.com/questions/51367707
复制相似问题