【问题标题】:How to avoid null pointer exception using SpEL如何使用 SpEL 避免空指针异常
【发布时间】:2019-07-10 16:41:19
【问题描述】:

我有如下声明:

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

方法规范接受一个后续对象的 ID,如果存在具有该 ID 的后续对象,该 ID 将被删除。

只要 findOne(#id) 不返回 null(如果存在具有该 id 的对象,则返回非 null),PreAuthorize 语句将起作用。

如果传入的 id 不属于后面的对象,就会出现问题,这意味着 .user 会导致空指针异常。如果存在(以下对象存在)传递userId的最佳方式是什么,如果它不存在,我们可以将null传递给isAllowedAccessByCurrentUser。

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

【问题讨论】:

    标签: spring spring-security spring-el


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 2019-04-24
      • 2015-05-07
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2017-02-18
      相关资源
      最近更新 更多