在 Spring Boot 中实现自定义异常

问题描述 投票:0回答:3

我有一个简单的 Spring Boot 应用程序,其中有很多表。我已经构建了他们的模型、存储库、服务和控制器文件。我还通过postman测试了所有的api。 现在我需要在我的模型中实现自定义异常。由于我处于初级阶段并正在学习,我有点困惑如何应用例外?

根据我的探索,我需要创建三个文件

ErrorDetails.java
GlobalExceptionHandler.java
ResourceNotFoundException.java

这是正确的吗?如果是,假设我已将这些文件添加到我的项目中。如何在我的 api 中实现这些异常?有谁能够帮助我?意味着很多。谢谢!

java spring-boot exception
3个回答
0
投票

每当出现资源不可用的情况时,就会抛出 ResourceNotFoundException,即

throw new ResourceNotFoundException("Error message of your choice");

例如在类

CustomerTypeRepository
中的方法
getCustomerTypebyID
中而不是下面的代码:

if (a == null) {
  return ResponseEntity.notFound().build();
}

你可以写

if (a == null) {
  throw new ResourceNotFoundException("Customer type doesn't exist with the given id: "+Id);
}

之后

@ControllerAdvice GlobalExceptionHandler
已经为 ResourceNotFoundException 处理程序实现了。所以不用担心。


0
投票

我相信将检查异常声明为合同,所以我会做这样的事情

@Service
public class CustomerCategorizationService {

@Autowired
private CustomerTypeRepository customerTypeRepository;

  // -------------- CustomerType API ----------------------- ///

  public CustomerType saveCustomerType(CustomerType obj) throws ServiceException {

其中

ServiceException
是应用程序中定义的自定义检查异常。

public CustomerType saveCustomerType(CustomerType obj) throws ServiceException {
  //Other code
  Long id;
  try {
    id = customerTypeRepository.save(obj);
  }catch(DataAccessException cause) {
    throw new ServiceException(cause.getMessage());
  }
  return id;
}

并且在

@ControllerAdvice

@ExceptionHandler(ServiceException.class)
public ResponseEntity<?> resourceNotFoundException(ServiceException ex, WebRequest request) {
    ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), 
 request.getDescription(false));
    return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);
}

我们可以更进一步,从 Controller 类抛出自定义异常(例如

ResourceException
),这将包装
ServiceException
。在这种情况下,我的
@ControllerAdvice
只需要处理
ResourceException


0
投票

您的实现看起来只是正确的,不要在控制层抛出异常,您可以从服务层抛出自定义异常。

使用控制器建议注释创建全局异常处理程序,并为每个自定义异常创建异常处理程序方法,并且内部方法可以使用 ErrorDetails 对象创建正确的错误消息,正如您所说的创建此类一样。

ControllerAdvice 类

@ControllerAdvice
public class GlobalExceptionHandler{

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<ErrorDetails> notFound(ResourceNotFoundException resourceNotFoundException) {
        // ErrorDetails is a custom class contains status code, message and all.
        ErrorDetails errorDetails= new ErrorDetails(HttpStatus.NOT_FOUND, userNotFoundException.getMessage());
        return new ResponseEntity<ErrorDetails>(errorDetails, HttpStatus.NOT_FOUND);
    }
}

控制器代码,

@GetMapping
public ResponseEntity<UserDto> getUser(@RequestParam("id") String id) {
    UserDto userDto = userService.getUserById(id);
    return new ResponseEntity<UserDto>(userDto, HttpStatus.OK);
}

服务层代码,

@Override
public User getUserById(String id) throws ResourceNotFoundException{
    Optional<User> user = userRepository.findById(Integer.parseInt(id));

    if (!user.isPresent()) throw new ResourceNotFoundException("Resource Not Found!");

    return user.get();
}
© www.soinside.com 2019 - 2024. All rights reserved.