@postfilter on可选

unftdfkk  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(284)

我想用 @PostFilter 论方法返回 Optional .
Spring DefaultMethodSecurityExpressionHandler 目前未处理 Optional 但我可以做一个简单的装饰和改造 Optional 进入 Stream . 我怎样才能注册这样的装饰而不创建一个新的 GlobalMethodSecurityConfiguration 因为我使用的是内部框架,所以无法修改。
还有别的办法吗?

kmynzznz

kmynzznz1#

解决方案很简单,只需将decorator声明为 @Service ```
@Service
public class OptionalAdapterMethodSecurityExpressionHandler implements MethodSecurityExpressionHandler {

private final MethodSecurityExpressionHandler handler

public CustomMethodSecurityExpressionHandler(MethodSecurityExpressionHandler handler){
    this.handler = handler;
}

@Autowired
public CustomMethodSecurityExpressionHandler(ApplicationContext applicationContext) {
    this(new DefaultMethodSecurityExpressionHandler());
    ((DefaultMethodSecurityExpressionHandler)this.original).setApplicationContext(applicationContext);
}

@Override
public Object filter(Object filterTarget, Expression filterExpression, EvaluationContext ctx) {
    if (filterTarget instanceof Optional) {
        final List<?> optionalUnfilteredList = ((Optional<?>) filterTarget).stream()
            .collect(Collectors.toList());

        final List<?> optionalFilteredList = (List<?>) this.handler.filter(optionalUnfilteredList, filterExpression, ctx);
        return optionalFilteredList.stream()
            .findFirst();
    }
    return this.handler.filter(filterTarget, filterExpression, ctx);
}

...

}

相关问题