我想知道是否有办法将@PathVariables
或@ModelAttributes
之类的所有参数解析器包装到一个单事务中?我们已经在使用OEMIV过滤器,但是spring / hibernate会产生太多的事务(如果它们没有包含在服务类中,则每个选择一个,例如路径变量解析器中的情况)。
虽然系统仍然非常快,但我认为这不是必需的,也不与架构的其他部分保持一致。
让我解释一下:
我们假设我有一个包含两个实体的请求映射,转换基于StringToEntityConverter
如果我们支持GET,实际的网址就是这样:http://localhost/app/link/User_231/Item_324
@RequestMapping("/link/{user}/{item}", method="POST")
public String linkUserAndItem(@PathVariable("user") User user, @PathVariable("item") Item item) {
userService.addItem(user, item);
return "linked";
}
@Converter
// simplified
public Object convert(String classAndId) {
return entityManager.find(getClass(classAndId), getId(classAndId));
}
UserService.addItem()
方法是事务性的,所以这里没有问题。
BUT:
实体转换器在调用Controller
之前解析用户和项目对数据库,从而创建两个选择,每个选择都在其自己的事务中运行。然后我们有@ModelAttribute
个方法,这些方法也可能会再次发出一些选择,每个方法都会产生一个事务。
这就是我想改变的地方。我想创建 ONE 只读事务
我无法通过Spring找到任何方法来拦截/倾听/等等。
首先,我想覆盖RequestMappingHandlerAdapter
,但解析器调用很好并且#34;隐藏"在invokeHandleMethod
方法内......
ModelFactory
不是一个春天的bean,所以我也不能写一个拦截器。
所以目前我只是通过完全取代RequestMappingHandlerAdapter
来看待一种方法,但我真的想避免这种情况。
想法?
答案 0 :(得分:0)
这对我来说似乎是一种设计失败。 OEMIV通常表明你做错了。
相反,请执行:
@RequestMapping("/link/User_{userId}/Item_{itemId}", method="POST")
public String linkUserAndItem(@PathVariable("userId") Long userId,
@PathVariable("itemId") Long itemId) {
userService.addItem(userId, itemId);
return "linked";
}
您的服务层负责获取和操作实体。该逻辑不属于控制器。