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

如何处理服务层中引发的异常?

梁韬
2023-03-14

我正在处理一个Spring启动应用程序。我尝试处理异常。但我想我这样做的方式有问题,因为它总是抛出内部服务器错误500。

我尝试设置自定义异常类,并且还使用带有@响应状态的响应状态代码。但是不管异常是什么,它只会抛出内部服务器错误。我使用的是intellij,我在异常中给出的消息打印在那里,但响应正文empty.This我想一定是因为它抛出了内部服务器错误。

控制器类

 @RequestMapping(value = "/attendance",method = RequestMethod.POST)
    public ResponseEntity<?> enterAttendance(@RequestBody ViewDTO viewDTO) throws CustomException{
        return new ResponseEntity<>(tempResultServices.handleAttendance(viewDTO),HttpStatus.OK);
    }
}


Service layer

    @Override
    public TempResult handleAttendance(ViewDTO viewDTO) throws CustomException {
        TempIdentity tempIdentity=new TempIdentity();
        tempIdentity.setRegistrationNo(viewDTO.getRegistrationNo());
        tempIdentity.setCourseId(viewDTO.getCourseId());
        tempIdentity.setYear(viewDTO.getYear());
        tempIdentity.setSemester(viewDTO.getSemester());

        User user=userService.findByUserId(viewDTO.getUserId());
        tempIdentity.setUser(user);

        if(!viewDTO.isAttendance()){
            TempResult tempResultUser =new TempResult(tempIdentity,viewDTO.isAttendance(),0);
            ResultIdentity resultIdentity=new ResultIdentity(tempIdentity.getRegistrationNo(),tempIdentity.getCourseId(),tempIdentity.getYear(),tempIdentity.getSemester());
            Result result=new Result(resultIdentity,0,"E*");

            AttendanceDraft attendanceDraft=atteDraftService.findDraft(viewDTO.getRegistrationNo(),viewDTO.getCourseId(),viewDTO.getYear(),viewDTO.getSemester(),viewDTO.getUserId());
            if(attendanceDraft!=null){
                attendanceDraft.setStatus(true);
                atteDraftService.save(attendanceDraft);
                //atteDraftService.delete(attendanceDraft);

                tempResultRepository.save(tempResultUser);
                resultRepository.save(result);

                return tempResultUser;
            }
            else{
                throw new CustomException("No draft available");
            }
        }
        else{
            TempResult tempResultUser =new TempResult(tempIdentity,viewDTO.isAttendance());



            AttendanceDraft attendanceDraft=atteDraftService.findDraft(viewDTO.getRegistrationNo(),viewDTO.getCourseId(),viewDTO.getYear(),viewDTO.getSemester(),viewDTO.getUserId());
            if(attendanceDraft!=null){
                attendanceDraft.setStatus(true);
                atteDraftService.save(attendanceDraft);
                //atteDraftService.delete(attendanceDraft);

                tempResultRepository.save(tempResultUser);

                return tempResultUser;
            }
            else{
                throw new CustomException("No draft available");
            }
        }
    }

The exception class

@ResponseStatus(code= HttpStatus.NOT_FOUND)
public class CustomException extends RuntimeException {
public CustomException(String message){
    super(message);
}

}

intellij 中的终端打印“无可用草稿”。但我不希望它作为内部服务器错误。有人可以告诉我我应该如何处理这些错误吗?

我试过使用@RestControllerAdvice

@RestControllerAdvice
public class WebRestControllerAdvice {

    @ExceptionHandler(CustomException.class)
    public ResponseMsg handleNotFoundException(CustomException ex) {
        ResponseMsg responseMsg = new ResponseMsg(ex.getMessage());
        return responseMsg;
    }

}

这是我的响应消息类

public class ResponseMsg {

    private String message;
//getters and setters
}

这是应用程序中的另一个简单请求

 @RequestMapping(value = "/user/view",method = RequestMethod.POST)
    public ResponseEntity<?> getUser(@RequestBody UserDTO userDTO) throws CustomException{
        User user=userService.findByUsername(userDTO.getUsername());
        if(user!=null){
            return ResponseEntity.ok(user);
        }
//
        throw new CustomException("User not found");
    }

但是仍然没有抛出自定义异常。响应正文为空。但是intellij说“没有找到用户”, postman返回状态代码500。

共有1个答案

暴阳州
2023-03-14

Spring boot有一种非常方便的方法来处理应用程序的任何层中的异常,它定义了一个@ControllerAdvice bean。然后,您可以在代码中抛出任何类型的异常,它将在这个类上“捕获”。

之后,您可以处理并返回应用程序需要返回的任何内容。顺便说一下,您可以返回自定义对象,它将自动解析为json。

文档:https://docs . spring . io/spring-boot/docs/current/reference/html single/

示例代码:

@ControllerAdvice
public class ErrorHandler {

@ExceptionHandler(BadRequestException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public Object processValidationError(BadRequestException ex) {
    //return whatever you need to return in your API
}

}
 类似资料:
  • 问题内容: 如果我的Dao层抛出了Dao特定的异常,那么在我的服务层中对它们的处理是否会引起关注的泄漏?如果是,那么我应该使异常通用且独立于任何层来解决它,还是有其他方法吗? 相同的问题适用于服务层引发的UI层处理异常。 问题答案: 当我们创建一个分层的应用程序时,总是有一个用户层和另一个使用过的层。对于这种情况,UI层->使用服务层->使用DAO层。 现在,它非常主观并且易于解释。但目标应该是

  • 我有一个rest服务,它将抛出一个异常,我想知道什么将是最好的方式来处理这一点。 我想知道这是rest服务中处理异常的正确方式吗? 我在用泽西。

  • 考虑以下示例: 这将输出从1到5的数字,然后打印异常。 我想要实现的是使观察器保持订阅状态,并在抛出异常后继续运行,即打印从1到10的所有数字。 我尝试过使用和其他各种错误处理操作符,但正如文档中所述,它们的目的是处理可观察对象本身发出的错误。 最直接的解决方案是将的整个主体包装成一个try-catch块,但对我来说这听起来不是一个好的解决方案。在类似的Rx中。NET问题,提出的解决方案是制作一个

  • 我正在将本地netty服务器连接到远程https服务器以代理请求。 下面是我如何创建ssLcontext bean 当我点击我的本地主机时,它应该代理到后端。我得到以下异常。但是,如果SSL关闭并且我连接到远程,这是在不同端口上运行的本地服务器,则工作正常 编辑 添加的日志

  • 我正试图自己解决参数问题。 我可以很容易地从NativeWebRequest获取输入参数,并将它们分派到相应的自定义@Param注释参数中。 问题是我还想在这方面做一些语法检查/验证。但如果我在“resolveArgument”中抛出异常,则会向用户显示完整的堆栈跟踪。这将是过度和不安全的。我只想向用户返回一条JSON格式的消息,以显示哪个输入参数语法有错误。

  • 问题内容: 考虑以下示例: 这将输出从1到5的数字,然后打印异常。 我要实现的是使观察者保持订阅状态,并在引发异常后继续运行,即打印从1到10的所有数字。 我曾尝试使用和其他各种错误处理运算符,但是,正如文档中所述,它们的目的是处理可观察对象自身发出的错误。 最直接的解决方案是将整个过程包装到try- catch块中,但这对我来说似乎不是一个好的解决方案。在类似的Rx.NET问题中,提出的解决方案