单个事务中的ArgumentResolvers?

时间:2014-06-08 08:51:11

标签: spring hibernate spring-mvc transactions

我想知道是否有办法将@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来看待一种方法,但我真的想避免这种情况。

想法?

1 个答案:

答案 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";
}

您的服务层负责获取和操作实体。该逻辑不属于控制器。