如何使用SpEL避免空指针异常

时间:2019-07-09 21:13:12

标签: spring spring-security spring-el

我有以下声明:

@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的关注对象不存在,我们将获得空指针异常

1 个答案:

答案 0 :(得分:0)

您可以使用safe navigation operator(即?.)浏览对象结构。当您访问null上的属性时,它将返回null而不是抛出NullPointerException

@PreAuthorize("@securityService.isAllowedAccessByCurrentUser(@followingServiceImpl.findOne(#id)?.user?.id)")

但是在这种情况下,我不会对SpEL施加太多逻辑。我将尝试将所有检查逻辑封装在一个bean方法中。@PreAuthorize中的SpEL只是引用类似于this的此方法。它更容易理解,并且普通的java方法调用比SpEL解决方案要快得多,而且类型安全。