我有一个简单的 Spring Boot 应用程序,其中有很多表。我已经构建了他们的模型、存储库、服务和控制器文件。我还通过postman测试了所有的api。 现在我需要在我的模型中实现自定义异常。由于我处于初级阶段并正在学习,我有点困惑如何应用例外?
根据我的探索,我需要创建三个文件
ErrorDetails.java
GlobalExceptionHandler.java
ResourceNotFoundException.java
这是正确的吗?如果是,假设我已将这些文件添加到我的项目中。如何在我的 api 中实现这些异常?有谁能够帮助我?意味着很多。谢谢!
每当出现资源不可用的情况时,就会抛出 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 处理程序实现了。所以不用担心。
我相信将检查异常声明为合同,所以我会做这样的事情
@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
您的实现看起来只是正确的,不要在控制层抛出异常,您可以从服务层抛出自定义异常。
使用控制器建议注释创建全局异常处理程序,并为每个自定义异常创建异常处理程序方法,并且内部方法可以使用 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();
}