我在我的项目中使用 Spring Boot、Spring Security Oauth 和 Spring Security,这是一个 REST 服务器,从它的控制器方法返回
ResponseEntity<>
。
现在,当我向返回
@PostFilter
的控制器方法添加 ResponseEntity<Iterable<WebUser>>
注释时,执行随后会失败,因为方法 filter(Object filterTarget, Expression filterExpression, EvaluationContext ctx)
只能处理类型为 Collection
和 Array
的对象。它无法从 ResponseEntity 中提取集合。
现在我的答案是通过从 ResponseEntity 中提取来扩展
DefaultMethodSecurityExpressionHandler
实现过滤器方法,并通过扩展 @EnableGlobalMethodSecurity
类并覆盖 GlobalMethodSecurityConfiguration
方法来使用它。如果我不使用 Spring Security OAuth,上面的方法会起作用,因为我发现
createExpressionHandler()
创建了自己的
OAuth2MethodSecurityConfiguration
,而我的自定义的则不会被创建。解决方案是将整个
OAuth2MethodSecurityExpressionHandler
类复制到我的项目中,并更改一行以使其创建提取
OAuth2MethodSecurityConfiguration
的 MyOAuth2MethodSecurityExpressionHandler extends OAuth2MethodSecurityExpressionHandler
,但这个解决方案对我来说似乎有点老套。所以,最后我想问是否有更好的方法来解决这个问题。也许我从一个不好的角度出发,错过了一个更直接的解决方案。
编辑:解决这个问题当然也是一个选择,但我主要寻找其他(更干净的)方法来配置 Spring @PostFilter 与 ResponseEntity<> (如果有的话)一起工作,以更好地理解 Spring Boot 的整体。
ResponseEntity
然后在控制器中
@Service
class TamasServiceImpl implement TamasService{
@PostFilter
public Iterable<TamasUser> loadAll(){
// return you data here
}
}
代码如下所示:
@Autowired
TamasService service;
@Get
public ResponseEntity<Iterable<TamasUser>> loadAll(){
return new ResponseEntity<>(service.loadAll(),HttpStatus.FOUND)
}
无论你喜不喜欢,自己决定。