我的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,但应用程序将以静默方式启动。如果切入点表达式不匹配,如何配置此方面以使应用程序启动失败?
答案 0 :(得分:0)
您可以使用@AfterThrowing
弹簧注释,然后可以通过以下方式进行拦截:
@AfterThrowing(value = "bean(...) && execution(...)", throwing = "ex")
public void interceptDataSourceErrors(Exception ex) {
// Doing something here with exception.
logger.debug( ex.getCause().getMessage());
}