Spring 4 @Transactional 和@Aspect
Spring 4 @Transactional and @Aspect
我有一个拦截器 class 用于监视对象的创建。我希望在服务的实际创建方法之前调用此拦截器以注入当前用户/日期。
/**
* Author: plalonde
* When: 2015-03-04
*/
@Aspect
public class IdentityInterceptor {
/**
* Injection de l'usagé actuellement en session dans l'entité.
*
* @param entity L'entité dans laquelle les informations de l'usagé doivent être injectée.
*/
@Before("execution(* com.t3e.persistence.service.CrudService.create(..)) && args(entity)")
public void giveOwnership(final TraceableDto entity) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
entity.setCreationUserId(authentication.getName());
entity.setCreationDate(new Date());
entity.setLastModificationUserId(authentication.getName());
entity.setLastModificationDate(new Date());
}
}
/**
* Author: plalonde
* When: 2015-04-22
*/
@Service
@Transactional(readOnly = true)
public class LocalWatsonLicenseService implements WatsonLicenseService {
@Autowired
private WatsonLicenseRepository repository;
/**
* Création d'une licence.
*
* @param watsonLicenseDetails Le détails de la licence à créer.
* @return L'instance de la licence mise à jour.
*/
@Transactional
@Override
public WatsonLicenseDetails create(final WatsonLicenseDetails watsonLicenseDetails) {
return repository.create(watsonLicenseDetails);
}
}
/**
* Author: plalonde
* When: 2015-04-22
*/
public interface WatsonLicenseService extends CrudService<WatsonLicenseDetails> {
}
我的拦截器从未被调用,我想知道是否因为服务的方法是@Transctional?
看起来 Aspect 配置良好,因为我有其他服务方法,一切都按预期工作。
我尝试查找文档,但我只收到有关使用 Aspect 处理事务的帖子,但这不是我的情况。
我的包装方法 return 应该更新值还是在切入点中传递并处理它?
[编辑]
拦截器是这样声明的
/**
* Author: plalonde
* When: 2015-04-22
*/
@Configuration
@EnableTransactionManagement
class DatabaseConfig {
@Value("${dataSource.driverClassName}")
private String driver;
@Value("${dataSource.url}")
private String url;
@Value("${dataSource.username}")
private String username;
@Value("${dataSource.password}")
private String password;
@Bean
public DataSource configureDataSource() {
DriverManagerDataSource dmds = new DriverManagerDataSource(url, username, password);
dmds.setDriverClassName(driver);
return dmds;
}
@Bean
public NamedParameterJdbcTemplate configureTemplate(final DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
@Bean
public PlatformTransactionManager transactionManager(final DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public IdentityInterceptor createInterceptor() {
return new IdentityInterceptor();
}
}
如 M.Deinum 评论中所述,我在配置 class 中忘记了 @EnableAspectJAutoProxy,这解决了问题。
允许时将其标记为正确答案。
我有一个拦截器 class 用于监视对象的创建。我希望在服务的实际创建方法之前调用此拦截器以注入当前用户/日期。
/**
* Author: plalonde
* When: 2015-03-04
*/
@Aspect
public class IdentityInterceptor {
/**
* Injection de l'usagé actuellement en session dans l'entité.
*
* @param entity L'entité dans laquelle les informations de l'usagé doivent être injectée.
*/
@Before("execution(* com.t3e.persistence.service.CrudService.create(..)) && args(entity)")
public void giveOwnership(final TraceableDto entity) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
entity.setCreationUserId(authentication.getName());
entity.setCreationDate(new Date());
entity.setLastModificationUserId(authentication.getName());
entity.setLastModificationDate(new Date());
}
}
/**
* Author: plalonde
* When: 2015-04-22
*/
@Service
@Transactional(readOnly = true)
public class LocalWatsonLicenseService implements WatsonLicenseService {
@Autowired
private WatsonLicenseRepository repository;
/**
* Création d'une licence.
*
* @param watsonLicenseDetails Le détails de la licence à créer.
* @return L'instance de la licence mise à jour.
*/
@Transactional
@Override
public WatsonLicenseDetails create(final WatsonLicenseDetails watsonLicenseDetails) {
return repository.create(watsonLicenseDetails);
}
}
/**
* Author: plalonde
* When: 2015-04-22
*/
public interface WatsonLicenseService extends CrudService<WatsonLicenseDetails> {
}
我的拦截器从未被调用,我想知道是否因为服务的方法是@Transctional?
看起来 Aspect 配置良好,因为我有其他服务方法,一切都按预期工作。
我尝试查找文档,但我只收到有关使用 Aspect 处理事务的帖子,但这不是我的情况。
我的包装方法 return 应该更新值还是在切入点中传递并处理它?
[编辑]
拦截器是这样声明的
/**
* Author: plalonde
* When: 2015-04-22
*/
@Configuration
@EnableTransactionManagement
class DatabaseConfig {
@Value("${dataSource.driverClassName}")
private String driver;
@Value("${dataSource.url}")
private String url;
@Value("${dataSource.username}")
private String username;
@Value("${dataSource.password}")
private String password;
@Bean
public DataSource configureDataSource() {
DriverManagerDataSource dmds = new DriverManagerDataSource(url, username, password);
dmds.setDriverClassName(driver);
return dmds;
}
@Bean
public NamedParameterJdbcTemplate configureTemplate(final DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
@Bean
public PlatformTransactionManager transactionManager(final DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public IdentityInterceptor createInterceptor() {
return new IdentityInterceptor();
}
}
如 M.Deinum 评论中所述,我在配置 class 中忘记了 @EnableAspectJAutoProxy,这解决了问题。
允许时将其标记为正确答案。