
本文介绍了如何在 Quarkus 中使用 SmallRye GraphQL 来自定义错误消息。默认情况下,RuntimeException 的消息可能不会直接显示在 GraphQL 响应中。通过配置 Quarkus 属性,您可以启用 RuntimeException 消息的显示,并指定要包含在错误扩展中的字段,从而实现更精细的错误处理和更友好的用户体验。
启用 RuntimeException 消息显示
默认情况下,SmallRye GraphQL 可能不会直接显示 RuntimeException 的消息。为了使自定义异常中的 getMessage() 方法生效,需要在 application.properties 文件中进行配置。
添加以下配置项,以启用 RuntimeException 消息的显示:
quarkus.smallrye-graphql.show-runtime-exception-message=true
这个配置会告诉 SmallRye GraphQL 显示 RuntimeException 及其子类的消息内容。
配置错误扩展字段
除了显示消息之外,您还可以配置要包含在错误扩展中的字段。这允许您在 GraphQL 响应中提供更详细的错误信息。
例如,如果您想将 SomeException 中的 someErrors 列表包含在错误扩展中,可以在 application.properties 中添加以下配置:
quarkus.smallrye-graphql.error-extension-fields=someErrors
这个配置告诉 SmallRye GraphQL 将 SomeException 类中名为 someErrors 的字段添加到错误响应的 extensions 部分。请注意,这里假设你的Exception类中存在一个名为someErrors的public字段或者存在对应的getter方法getSomeErrors()。
示例代码
下面是一个完整的示例,展示了如何自定义异常以及如何在 Quarkus 中配置 SmallRye GraphQL 来显示自定义错误消息和扩展字段。
首先,定义一个自定义异常类:
import graphql.ErrorClassification;
import graphql.GraphQLError;
import graphql.language.SourceLocation;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class SomeException extends RuntimeException implements GraphQLError {
private List someErrors;
private String errorMessage;
public SomeException(String message, List someErrors) {
this.errorMessage = message;
this.someErrors = someErrors;
}
@Override
public String getMessage() {
return this.errorMessage;
}
@Override
public ErrorClassification getErrorType() {
return null;
}
@Override
public Map getExtensions() {
return Collections.singletonMap("someErrors", someErrors);
}
@Override
public List getLocations() {
return null;
}
} 然后,在 GraphQL resolver 中抛出这个异常:
import jakarta.inject.Inject;
import org.eclipse.microprofile.graphql.GraphQLApi;
import org.eclipse.microprofile.graphql.Query;
import java.util.Arrays;
import java.util.List;
@GraphQLApi
public class MyGraphQLApi {
@Query
public String something() {
List errors = Arrays.asList("Error 1", "Error 2");
throw new SomeException("Custom error message", errors);
}
} 最后,在 application.properties 中添加以下配置:
quarkus.smallrye-graphql.show-runtime-exception-message=true quarkus.smallrye-graphql.error-extension-fields=someErrors
注意事项
- 确保 application.properties 文件位于正确的目录下(通常是 src/main/resources)。
- quarkus.smallrye-graphql.error-extension-fields 配置的值应该是异常类中字段的名称,或者对应getter方法去掉get后的名称,多个字段用逗号分隔。
- 如果错误消息仍然没有显示,请检查是否正确地实现了 GraphQLError 接口,并确保 getMessage() 方法返回的是您期望的自定义消息。
总结
通过配置 Quarkus 属性,您可以轻松地自定义 SmallRye GraphQL 中的错误消息和扩展字段。这使得您可以提供更详细、更友好的错误信息,从而改善 GraphQL API 的用户体验。记住启用 RuntimeException 消息的显示,并根据需要配置错误扩展字段,以便在 GraphQL 响应中包含自定义错误信息。










