GraphQL java以json格式发送自定义错误

jsJava

1个回答

写回答

quilllll

2025-07-01 08:35

+ 关注

Java
Java

使用GraphQL Java以JSON格式发送自定义错误

GraphQL是一种用于API的查询语言和运行时环境,它允许客户端以一种简洁、灵活的方式来描述数据需求,并由后端服务提供相应的数据。GraphQL Java是一个用Java编写的GraphQL实现,它提供了创建和操作GraphQL的能力。在本文中,我们将探讨如何在使用GraphQL Java时以JSON格式发送自定义错误。

什么是自定义错误?

自定义错误是指当后端服务在处理GraphQL请求时遇到问题时,向客户端返回的错误信息。这些错误信息可以包含有关错误原因、错误代码或者其他相关信息。通常,GraphQL会以统一的格式返回错误,例如:

JSon

{

"errors": [

{

"message": "Something went wrong"

}

]

}

然而,有时候我们希望返回更加详细和自定义的错误信息,以帮助客户端更好地理解和处理错误。下面是一个示例,展示了如何在GraphQL Java中发送自定义错误。

如何发送自定义错误?

要发送自定义错误,我们需要定义一个实现了GraphQLError接口的错误类,并在GraphQL异常处理器中使用它。下面是一个简单的例子:

Java

public class CustomError implements GraphQLError {

private String message;

private int statusCode;

public CustomError(String message, int statusCode) {

this.message = message;

this.statusCode = statusCode;

}

@Override

public Map<String, Object> getExtensions() {

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

extensions.put("statusCode", statusCode);

return extensions;

}

@Override

public List<SourceLocation> getLocations() {

return null;

}

@Override

public ErrorType getErrorType() {

return ErrorType.DataFetchingException;

}

@Override

public String getMessage() {

return message;

}

}

public class MyGraphQLExceptionHandler implements GraphQLErrorHandler {

@Override

public List<GraphQLError> processErrors(List<GraphQLError> errors) {

List<GraphQLError> processedErrors = new ArrayList<>();

for (GraphQLError error : errors) {

if (error instanceof CustomError) {

CustomError customError = (CustomError) error;

processedErrors.add(customError);

} else {

processedErrors.add(error);

}

}

return processedErrors;

}

}

public class MyApp {

public static void mAIn(String[] args) {

GraphQLSchema schema = // 构建GraphQLSchema的代码

GraphQL graphQL = GraphQL.newGraphQL(schema)

.errorHandler(new MyGraphQLExceptionHandler())

.build();

// 处理GraphQL请求的代码

}

}

在上面的代码中,我们定义了一个CustomError类,它实现了GraphQLError接口,并重写了相关方法来返回自定义的错误信息。我们还创建了一个MyGraphQLExceptionHandler类,它实现了GraphQLErrorHandler接口,并在processErrors方法中处理自定义错误。最后,我们在创建GraphQL实例时使用自定义异常处理器来处理错误。

案例代码

假设我们正在构建一个电子商务应用程序的后端服务,其中有一个查询product,用于获取产品的详细信息。如果找不到指定的产品,我们希望返回一个自定义的错误,以告诉客户端产品不存在。下面是一个示例代码,演示了如何在GraphQL Java中发送自定义错误:

Java

public class ProductNotFoundException extends RuntimeException {

public ProductNotFoundException(String message) {

super(message);

}

}

public class ProductResolver implements GraphQLResolver<Product> {

public ProductResolver(ProductRepository productRepository) {

this.productRepository = productRepository;

}

public Product product(String id) {

Product product = productRepository.findById(id);

if (product == null) {

throw new ProductNotFoundException("Product not found");

}

return product;

}

}

public class MyGraphQLExceptionHandler implements GraphQLErrorHandler {

@Override

public List<GraphQLError> processErrors(List<GraphQLError> errors) {

List<GraphQLError> processedErrors = new ArrayList<>();

for (GraphQLError error : errors) {

if (error instanceof ProductNotFoundException) {

ProductNotFoundException exception = (ProductNotFoundException) error;

processedErrors.add(new CustomError(exception.getMessage(), 404));

} else {

processedErrors.add(error);

}

}

return processedErrors;

}

}

public class MyApp {

public static void mAIn(String[] args) {

ProductRepository productRepository = // 初始化ProductRepository的代码

ProductResolver productResolver = new ProductResolver(productRepository);

GraphQLSchema schema = // 构建GraphQLSchema的代码

GraphQL graphQL = GraphQL.newGraphQL(schema)

.errorHandler(new MyGraphQLExceptionHandler())

.build();

// 处理GraphQL请求的代码

}

}

在上面的代码中,我们定义了一个ProductNotFoundException类,它继承自RuntimeException。在ProductResolver类中,如果找不到指定的产品,我们抛出一个ProductNotFoundException异常。在MyGraphQLExceptionHandler类的processErrors方法中,我们捕获该异常,并将其转换为一个自定义错误,然后返回给客户端。

通过使用GraphQL Java,我们可以方便地发送自定义错误信息给客户端。首先,我们需要定义一个实现了GraphQLError接口的错误类,并在异常处理器中使用它。然后,根据需要捕获和处理异常,并返回自定义的错误。这样,客户端就能更好地理解和处理错误,从而提高应用程序的可用性和用户体验。

参考文献

- GraphQL Java官方文档: Java.com/documentation/v16/">https://www.graphql-Java.com/documentation/v16/

- GraphQL官方文档: https://graphql.org/

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号