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

How to avoid null pointer exception using SpEL

我有以下声明:

@PreAuthorize("@securityService.isAllowedAccessByCurrentUser(@followingServiceImpl.findOne(#id).user.id)")
public void delete(@PathVariable("id") final Long id) {

方法规范接受后续对象的 ID,如果后续对象具有此类 ID,则该 ID 将被删除。

只要 findOne(#id) 不为 return null(如果存在具有该 ID 的对象,returns 不为 null),PreAuthorize 语句就会起作用。

如果传入的id不属于后面的对象,那么问题就来了,也就是说.user会导致空指针异常。如果存在(存在以下对象),传递 userId 的最佳方法是什么?如果不存在,我们可以将 null 传递给 isAllowedAccessByCurrentUser。

目前,如果具有所述 ID 的跟随对象不存在,我们将得到空指针异常

您可以使用 safe navigation operator(即 ?.)来导航对象结构。当您在 null 上访问 属性 时,它将 return null 而不是抛出 NullPointerException

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

但在这种情况下,我不会把过多的逻辑放在SpEL上。我会尝试把所有的检查逻辑都封装在一个bean方法中。@PreAuthorize中的SpEL只是指这个类似于的方法。它更容易理解,正常的 java 方法调用比 SpEL 解决方案快得多,而且类型安全。