如果AOP切入点表达式不匹配,如何使Spring应用程序启动失败?

时间:2019-04-29 11:16:07

标签: spring spring-aop

我的Spring Boot应用程序中有2个数据源。每当我建立连接并在Security Context中有一个用户主体时,我想通过调用过程在数据库包的上下文中设置用户的ID。

为此,我创建了一个如下的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切入点指示符(因为我有2个数据源)。这似乎不是类型安全的。如果DS Bean名称将来会更改,则切入点表达式将不匹配任何Bean,但应用程序将以静默方式启动。如果切入点表达式不匹配,如何配置此方面以使应用程序启动失败?

1 个答案:

答案 0 :(得分:0)

您可以使用@AfterThrowing弹簧注释,然后可以通过以下方式进行拦截:

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