【发布时间】:2015-11-15 13:49:29
【问题描述】:
我有一个使用 Spring 和 Hibernate 实现的 Web 应用程序。应用程序中典型的控制器方法如下所示:
@RequestMapping(method = RequestMethod.POST)
public @ResponseBody
Foo saveFoo(@RequestBody Foo foo, HttpServletRequest request) throws Exception {
// authorize
User user = getAuthorizationService().authorizeUserFromRequest(request);
// service call
return fooService.saveFoo(foo);
}
典型的服务类如下所示:
@Service
@Transactional
public class FooService implements IFooService {
@Autowired
private IFooDao fooDao;
@Override
public Foo saveFoo(Foo foo) {
// ...
}
}
现在,我想创建一个Log 对象,并在每次保存Foo 对象时将其插入数据库。这些是我的要求:
-
Log对象应包含来自授权的User对象的userId。 -
Log对象应包含来自HttpServletRequest对象的一些属性。 - 保存操作和日志创建操作应该是原子的。 IE。如果 foo 对象保存在对象中,我们应该在数据库中有相应的日志,指示用户和操作的其他属性。
由于事务管理是在服务层处理的,因此创建日志并将其保存在控制器中违反了原子性要求。
我可以将Log 对象传递给FooService,但这似乎违反了关注点分离原则,因为日志记录是一个横切关注点。
我可以将事务注释移动到控制器,这在我读过的许多地方都没有建议。
我还阅读了有关使用 Spring AOP 和拦截器完成这项工作的信息,我对此几乎没有什么经验。但是他们正在使用服务类中已经存在的信息,我无法弄清楚如何将信息从HttpServletRequest 或授权User 传递给该拦截器。
我感谢任何可以满足此场景要求的指导或示例代码。
【问题讨论】:
标签: java spring spring-mvc transactions transactional