我有以下声明:
@PreAuthorize("@securityService.isAllowedAccessByCurrentUser(@followingServiceImpl.findOne(#id).user.id)")
public void delete(@PathVariable("id") final Long id) {
方法规范中包含一个后续对象的ID,如果存在具有此ID的后续对象,该对象将被删除。
只要findOne(#id)不返回null(如果存在具有该id的对象,则不返回null),PreAuthorize语句将起作用。
如果传入的id不属于以下对象,则会出现问题,这意味着.user将导致空指针异常。传递userId的最佳方法是(如果存在)(以下对象存在),如果不存在,则可以将null传递给isAllowedAccessByCurrentUser。
目前,如果具有所述ID的关注对象不存在,我们将获得空指针异常
答案 0 :(得分:0)
您可以使用safe navigation operator(即?.
)浏览对象结构。当您访问null上的属性时,它将返回null而不是抛出NullPointerException
:
@PreAuthorize("@securityService.isAllowedAccessByCurrentUser(@followingServiceImpl.findOne(#id)?.user?.id)")
但是在这种情况下,我不会对SpEL施加太多逻辑。我将尝试将所有检查逻辑封装在一个bean方法中。@PreAuthorize
中的SpEL只是引用类似于this的此方法。它更容易理解,并且普通的java方法调用比SpEL解决方案要快得多,而且类型安全。