在Spring Framework中使用路径变量覆盖ModelAttribute

时间:2018-01-26 09:09:37

标签: java spring rest spring-mvc spring-boot

我正在使用Spring Framework开发API并面临一个问题,可以通过简单地向我拥有它的每个地方添加必要的逻辑来解决,但我认为可能有一个优雅的解决方案来解决它。

我的控制器中有以下方法:

@GetMapping("/user/{userId}/permissions")
public List<PermissionDto> list(@PathVariable long userId,
                                @ModelAttribute @Valid PermissionCriteria criteria) {
    return permissionService.list(criteria);
}

事实上,在dto中我有一个名为userId的字段。它没有让很多论据进入服务方法。但是,我希望从路径中精确设置此用户ID,因为我使用指定我们正在向特定用户资源添加权限的URL。通过在条件中使用setter的附加行并设置userId的值,可以做到这一点。但是,现在我永远不会忘记每次有这样的情况时添加这一行。这就是我决定将其移至InitBinder的原因:

@InitBinder(PERMISSIONS_CRITERIA_NAME)
public void permissionsCriteriaInitBinder(WebDataBinder binder) {
    PermissionsCriteria criteria = (PermissionsCriteria) binder.getTarget();
    Optional.ofNullable(requestHelper.getUserId())
            .map(Long::parseLong)
            .ifPresent(criteria::setUserId);
}

工作正常。用户ID是从路径设置的。但是,如果我同时指定请求参数和路径变量,即使userId是从init binder中的路径设置的,它也会在转到控制器方法之前被覆盖。所以,这个并不能解决所有问题。 我想要找到的,是可以将逻辑应用于init绑定器(我需要它进行验证)和控制器方法的地方。也许有一种特殊类型的钩子或拦截器或至少要实现什么来满足这个条件?

0 个答案:

没有答案