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

无法在graphql spqr spring boot starter中摆脱“获取数据时异常(/{apiName})”

况胡媚
2023-03-14

我正在使用“io”的“graphql spqr spring boot starter”库版本0.0.4。利安根。图形QL’。我可以自定义错误。参考以下代码和屏幕截图:

型号:

@Getter
@Setter
@ToString
@Entity
@Accessors
public class Student {
    
    @Id 
    @GraphQLQuery(name = "id", description = "A Student's ID")
    private Long id;
    
    @GraphQLQuery(name = "name", description = "A student's name")
    private String name;    
    
    private String addr;

}

服务等级:

@Service
@GraphQLApi
public class StudentService{
    
    private final StudentRepository studentRepository;
    private final AddressRepository addressRepository;
    
    public StudentService(StudentRepository studentRepository, AddressRepository addressRepository) {
        this.addressRepository = addressRepository;
        this.studentRepository = studentRepository;
    }
    
    @GraphQLQuery(name = "allStudents")
    public List<Student> getAllStudents() {
        return studentRepository.findAll();
    }

    @GraphQLQuery(name = "student")
    public Optional<Student> getStudentById(@GraphQLArgument(name = "id") Long id) {
        if(studentRepository.findById(id) != null)
            return studentRepository.findById(id);
        throw new StudentNotFoundException("We were unable to find a student with the provided id", "id");
    }
    
    @GraphQLMutation(name = "saveStudent")
    public Student saveStudent(@GraphQLArgument(name = "student") Student student) {
        if(student.getId() == null)
            throw new NoIdException("Please provide an Id to create a Student entry.");
        return studentRepository.save(student);
    }
}

自定义异常类:

import java.util.List;

import graphql.ErrorType;
import graphql.GraphQLError;
import graphql.language.SourceLocation;

public class NoIdException extends RuntimeException implements GraphQLError {
    
    private String noIdMsg;
    
    public NoIdException(String noIdMsg) {
        this.noIdMsg = noIdMsg;
    }

    @Override
    public List<SourceLocation> getLocations() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ErrorType getErrorType() {
        // TODO Auto-generated method stub
        return ErrorType.ValidationError;
    }

    @Override
    public String getMessage() {
        // TODO Auto-generated method stub
        return noIdMsg;
    }
}

然而,我不知道如何在获取数据(/saveStudent)时消除异常,如上面的消息字段截图所示。我知道我们可以有一个实现GraphQLErrorHandler(GraphqlJava kickstart)的类。但是sqprSpring启动启动器的选项是什么?

import graphql.*;
import graphql.kickstart.execution.error.*;
import org.springframework.stereotype.*;

import java.util.*;
import java.util.stream.*;

@Component
public class GraphQLExceptionHandler implements GraphQLErrorHandler {

    @Override
    public List<GraphQLError> processErrors(List<GraphQLError> list) {
        return list.stream().map(this::getNested).collect(Collectors.toList());
    }

    private GraphQLError getNested(GraphQLError error) {
        if (error instanceof ExceptionWhileDataFetching) {
            ExceptionWhileDataFetching exceptionError = (ExceptionWhileDataFetching) error;
            if (exceptionError.getException() instanceof GraphQLError) {
                return (GraphQLError) exceptionError.getException();
            }
        }
        return error;
    }
}

有人能帮我删除这条声明并只发送特定的信息吗?

共有1个答案

郭彬郁
2023-03-14

您可以创建一个Bean并覆盖datafetchereexceptionhandler。要覆盖它,还必须覆盖执行策略:

@Bean
public GraphQL graphQL(GraphQLSchema schema) {
    return GraphQL.newGraphQL(schema)
            .queryExecutionStrategy(new AsyncExecutionStrategy(new CustomDataFetcherExceptionHandler()))
            .mutationExecutionStrategy(new AsyncSerialExecutionStrategy(new CustomDataFetcherExceptionHandler()))
            .build();
}

private static class CustomDataFetcherExceptionHandler implements DataFetcherExceptionHandler {

    @Override
    public DataFetcherExceptionHandlerResult onException(DataFetcherExceptionHandlerParameters handlerParameters) {
        Throwable exception = handlerParameters.getException();
        SourceLocation sourceLocation = handlerParameters.getSourceLocation();
        CustomExceptionWhileDataFetching error = new CustomExceptionWhileDataFetching(exception, sourceLocation);

        return DataFetcherExceptionHandlerResult.newResult().error(error).build();
    }
}

private static class CustomExceptionWhileDataFetching implements GraphQLError {

    private final String message;
    private final List<SourceLocation> locations;

    public CustomExceptionWhileDataFetching(Throwable exception, SourceLocation sourceLocation) {
        this.locations = Collections.singletonList(sourceLocation);
        this.message = exception.getMessage();
    }

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

    @Override
    public List<SourceLocation> getLocations() {
        return this.locations;
    }

    @Override
    public ErrorClassification getErrorType() {
        return ErrorType.DataFetchingException;
    }
}
 类似资料:
  • 我正在运行hadoop集群,Ubuntu主机作为主从,虚拟机作为另一个从运行在它上(2节点集群)。 似乎这个问题的解决方案在没有数据节点启动时就应该解决,对我来说不起作用。我试了那里解释的两种解决方案。 似乎当我手动将受影响的datanodes的命名空间ID等同于name node并启动集群时(链接帖子中的解决方案2),我仍然会得到相同的错误(DataStreamer异常)。接下来,其中一个dat

  • 问题内容: 我正在尝试更新服务器上的用户位置 使用此功能 这是代表 我有Optional(“”)和和变量,不能摆脱它。 任何想法如何做到这一点? 问题答案: 如果您像这样解开纬度和经度值… …然后您可以在函数中完全避免使用可选: 没错…除非您有充分理由强制拆开它们,否则应该养成安全地解开可选内容的习惯。而且,仅尝试摆脱可选内容以使代码可以编译并不是一个很好的理由。

  • 我是spring boot的新手,我正在通过ControllerAdvisor向控制器添加自定义异常。在MyController.class中,我正在执行三个操作 null 下面的类是特定于未找到的异常的。 在application.properties中,我添加了以下三个条件 当我使用GET API http://localhost:8080/ticke访问我的服务器时,它应该抛出bad req

  • 我有以下html代码,我无法选中复选框。 我正在获取TimeoutException:

  • 我有JavaWebService代码在我的eclipse。我使用了@WebService@Webmethod,@XmlElements,@XmlType,@XmlAccessorType 现在我正在使用cxf框架中的java2ws命令生成wsdl。这是命令 我的wsdl文件包含agr0作为我不想要的名称,因为当我将其导入SoapUI时。它正在字段周围添加标记。 下面是带有arg0的wsdl部分 下

  • 问题内容: 我正在使用express在nodejs上运行服务器。我似乎无法摆脱标题: 我想知道是否有任何方法可以摆脱此标头,还是我必须忍受它? 问题答案: 在Express> = 3.0.0rc5中: 这是一个简单的中间件,可以删除早期版本的Express中的标头: