Having Azure SQL server on cloud, Connecting via Springboot 3.2.5 using Spring Data JPA.
Able to fetch data and insert values using JPA entities, while trying to do error handling unable to extract the exact error codes as we need to prepare custom error messages for each type of error – for example the below service method save(student) is being called from controller
public void save(Student student)
{
saveReferenceData(student);
saveStudent(student);
}
// Calls method to set REference data
private saveReferenceData(Student student){
student.setStatus(statusRepository.findById(student.getStatus()).get());
}
//later calls save method in a transactional boundary as its all or none save for child entities
@Transactional
(rollbackFor = {NullPointerException.class, SQLException.class, DataAccessException.class, Exception.class
}, isolation = Isolation.READ_COMMITTED)
public saveStudent(Student student){
studentRepository.save(student);
}
I have Exception handler defined but nothing gets caught in that exception handler as everything just comes as Exception and when I debug, most times when reference data fails, it gives me NULL exception saying no such element exception as student.setStatus(statusRepository.findById(student.getStatus()).get() gives null when a particular status code is not found.
Requirement – do exception handling in such a way that each of the following exceptions can be handled in a custom manner –
Unable to connect to the DB (HTTP-503, 502, 401) –> Throw custome exception with Custom error message
Login Error/Permission Error –> Throw custome exception with Custom error message
Connection Time Out (HTTP-504) –> Throw custome exception with Custom error message
Transaction time out (HTTP-408) –> Throw custome exception with Custom error message
Primary Key Violation –> Throw custome exception with Custom error message
Foreign key violation error –> Throw custome exception with Custom error message
Null Constraint Violation –> Throw custome exception with Custom error message
I have tried to catch these in the exception class as below –
@ExceptionHandler(SQLException.class)
public final ResponseEntity<Response> sqlExceptionWhileInsert(
MyCustomeException ex, WebRequest request) throws MyCustomeException {
if (ex.getCause().toString().contains("SQL Error: 2627") && ex.getCause().toString().contains("SQLState: 23000"))
throw new MyCustomeException(""Error in insert,ApiConstants.E05,"",HttpStatus.422);
return new ResponseEntity<>(response, responseHeaders, HttpStatus.422);
}
Please suggest how best to catch these exceptions separately?
Thanks
1