Problem:
Spring boot service using MVCS architecture. I am using Spring AOP advice (around advice) for all functions present in any class in repository directory. So for example when jpa save method is called, the around advice is triggered.
Now, Here is how things get called when no exception occurs.
CONTROLLER->SERVICE LAYER->call to repository layer function triggers advice function which allows join point to proceed->REPOSITORY LAYER->around advice-> and everything executes fine.
Now, Here is the flow when exception is thrown by the controller advice function.
CONTROLLER->SERVICE LAYER->call to repository layer function triggers advice function which allows join point to proceed->REPOSITORY LAYER->some DB exception occurs (for example trying to set a database attribute with NON NULL constraint to NULL)->back to controller advice, it catches the exception then throws a custom checked exception to service layer and than going through service layer and then controller where the exception is handled.
The problem is that service layer doesn't know about controller advice (it acts like a proxy) and thinks that repository layer won't throw any exception since it doesn't declare
throwsin its methods signature (for example the default save method).So the exception that reaches the controller is not the one which is thrown by the controller advice functions. In fact Java wraps that exception inside UndeclaredThrowableException.
One way to deal with this situation is to check ex.getCause() and get the exception which java wrapped in UndeclaredThrowableException.
Another is to declare
throwsin the repository methods signature so that the service layers can know about the repository function throwing exception. (But this is not possible for default implementation provided by jpa - like the save function - atleast not without overriding the save function) and this I don't want to do because there are a lot of jpa inbuilt functions to override.
Any elegant solution/suggestion to the problem ?