Как завершить запуск приложения Spring, если выражение AOP Pointcut не было найдено? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть 2 источника данных в моем приложении Spring Boot. Всякий раз, когда я беру соединение, и в контексте безопасности есть субъект пользователя, я хотел бы установить идентификатор пользователя в контексте пакета базы данных, вызвав процедуру.

Чтобы достичь этого, я создал совет AOP, подобный этому:

@Configuration
@Aspect
class SqlAuthAopConfig {

    @AfterReturning(
            value = "bean(myDataSource) && execution(java.sql.Connection javax.sql.DataSource+.getConnection(..))",
            returning = "connection")
    fun initUser(connection: Connection) {

        val principal = SecurityContextHolder.getContext().authentication.principal as? MyUser ?: return

        connection.prepareStatement("BEGIN P_AUTH.SET_ID(?);END;").use { ps ->
            ps.setLong(1, principal.id)
            ps.execute()
        }
    }
}

Как вы можете видеть, я использовал beans указатель pointcut (потому что у меня есть 2 источника данных). Это не похоже на типобезопасность. Если имя bean-компонента DS изменится в будущем, выражение pointcut не будет соответствовать ни одному bean-компоненту, но приложение будет запущено без вывода сообщений. Как я могу настроить этот аспект, чтобы не запускать приложение, если выражение pointcut не совпадало?

1 Ответ

0 голосов
/ 29 апреля 2019

Вы можете использовать @AfterThrowing аннотацию пружины, затем вы можете перехватить следующим образом:

@AfterThrowing(value = "bean(...) && execution(...)", throwing = "ex")
public void interceptDataSourceErrors(Exception ex) {
    // Doing something here with exception.
    logger.debug( ex.getCause().getMessage());
}      
...