JPA - 带有@PostFilter的findById:过滤器目标必须是集合或数组类型,但是是可选的
JPA - findById with @PostFilter: Filter target must be a collection or array type, but was Optional
我刚刚将我的应用程序更新到 Spring Boot 2.0。3.RELEASE 并发现我在 @PostFilter 中的 SpEL 不再工作:
@PreAuthorize("isFullyAuthenticated()")
@PostFilter("hasAuthority('ADMIN') or @companyService.isOwnerOfPerson(#id, principal)")
@Override
public Optional<Person> findById(@Param("id") String id);
错误是
org.springframework.security.authentication.InternalAuthenticationServiceException: 过滤目标必须是集合或数组类型,但是是Optional[Person ...]
我看到有人在 https://jira.spring.io/browse/SPR-15878 上讨论这个问题,但我试图解决这个问题 运行:我扩展了 DefaultMethodSecurityExpressionHandler 并按照所引用的票证中的建议覆盖了 setReturnObject 方法以上:
public class CustomMethodSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandler {
@Override
public void setReturnObject(Object returnObject, EvaluationContext ctx) {
if (returnObject instanceof Optional) {
Optional<?> optional = (Optional<?>)returnObject;
Object value = null;
if (optional.isPresent()) {
value = optional.get();
}
((MethodSecurityExpressionOperations) ctx.getRootObject().getValue())
.setReturnObject(value);
} else {
super.setReturnObject(returnObject, ctx);
}
}
}
接下来,我配置方法安全性如下:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
return new CustomMethodSecurityExpressionHandler();
}
}
我不确定这是不是应该的样子,但我知道它还行不通 ;)
有人能帮忙吗?
出现此错误是因为@PostFilter 仅适用于作为 return 值的集合(或数组),而 findById 仅 return 是单个值的可选值。您可以在异常消息中看到它:
Filter target must be a collection or array type
我刚刚将我的应用程序更新到 Spring Boot 2.0。3.RELEASE 并发现我在 @PostFilter 中的 SpEL 不再工作:
@PreAuthorize("isFullyAuthenticated()")
@PostFilter("hasAuthority('ADMIN') or @companyService.isOwnerOfPerson(#id, principal)")
@Override
public Optional<Person> findById(@Param("id") String id);
错误是 org.springframework.security.authentication.InternalAuthenticationServiceException: 过滤目标必须是集合或数组类型,但是是Optional[Person ...]
我看到有人在 https://jira.spring.io/browse/SPR-15878 上讨论这个问题,但我试图解决这个问题 运行:我扩展了 DefaultMethodSecurityExpressionHandler 并按照所引用的票证中的建议覆盖了 setReturnObject 方法以上:
public class CustomMethodSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandler {
@Override
public void setReturnObject(Object returnObject, EvaluationContext ctx) {
if (returnObject instanceof Optional) {
Optional<?> optional = (Optional<?>)returnObject;
Object value = null;
if (optional.isPresent()) {
value = optional.get();
}
((MethodSecurityExpressionOperations) ctx.getRootObject().getValue())
.setReturnObject(value);
} else {
super.setReturnObject(returnObject, ctx);
}
}
}
接下来,我配置方法安全性如下:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
return new CustomMethodSecurityExpressionHandler();
}
}
我不确定这是不是应该的样子,但我知道它还行不通 ;)
有人能帮忙吗?
出现此错误是因为@PostFilter 仅适用于作为 return 值的集合(或数组),而 findById 仅 return 是单个值的可选值。您可以在异常消息中看到它:
Filter target must be a collection or array type