SpringBoot4.0新特性-Null-safety消灭空指针

核心目标

该机制的核心目标就是通过在编译时进行静态代码检查,防止运行时抛出空指针异常。SpringBoot4.0默认集成JSpecify框架,支持使用JSpecify注解来声明API、字段及相关类型的可空性。

举个例子,现在有一个接口和实现类:

java 复制代码
public interface TokenExtractorService {
    String extractToken(String input);
}
@Service
public class TokenExtractorServiceImpl implements TokenExtractorService {
    @Override
    public String extractToken(String input) {
        return input;
    }
}

我们想要在编译期就能表达:入参不允许为null,返回允许为null,该如何来做呢?

可空性设置

我们可以使用@NonNull@Nullable注解来说明这些类型的可空性。具体来说可以有两种方式,显式设置和隐式统一设置。

显式设置可空性

只需要在参数和返回上分别添加对应的注解即可:

java 复制代码
public interface TokenExtractorService {
    @Nullable String extractToken(@NonNull String input);
}
@Service
public class TokenExtractorServiceImpl implements TokenExtractorService {
    @Override
    public @Nullable String extractToken(@NonNull String input) {
        return input;
    }
}
  • @NonNull:不能为空
  • @Nullable: 可以为空

加完这些标记以后,当我们调用这个方法的时候,IDEA就会有对应的错误提示:

java 复制代码
@GetMapping("/demo")
 public String demo(){
     String token = tokenExtractorService.extractToken(null);
     return token.toUpperCase();
 }

以上代码,IDEA会给出2个警告:

隐式设置可空性

大多数情况下,我们一般默认这些参数、返回、字段、类型都是非空的,因此只需要明确的说明可空即可,因此我们还可以在包级别统一设置默认的可空性,这个可以借助package-info.java来实现。

首先在service包下面添加package-info.java

java 复制代码
@NullMarked
package com.github.xjs.service;
import org.jspecify.annotations.NullMarked;
  • @NullMarkedcom.github.xjs.service这个包下面所有的参数、返回、字段、类型默认都是不允许为空
  • @NullUnmarked:默认都允许为空,一般很少用

此时,就可以删除代码中的@NonNull注解,只保留@Nullable即可:

java 复制代码
public interface TokenExtractorService {
    @Nullable String extractToken(String input);
}
@Service
public class TokenExtractorServiceImpl implements TokenExtractorService {
    @Override
    public @Nullable String extractToken(String input) {
        return input;
    }
}

更多关于可空性的话题,比如:如何设置数组、泛型的可空性,如何与CI/CD集成,如何忽略告警,请参考:SpringBoot4.0新特性-Null-safety消灭空指针

相关推荐
lierenvip1 天前
SQL 建表语句详解
java·数据库·sql
kuntli1 天前
Spring Bean生命周期全解析
java
ok_hahaha1 天前
java从头开始-苍穹外卖-day06-微信小程序开发-微信登录和商品浏览
java·微信·微信小程序·小程序
Java面试题总结1 天前
Spring @Validated失效?原因、排查与高效解决方案全解析
java·spring boot·spring
剑锋所指,所向披靡!1 天前
MySQL数据的增删改查
java·数据库·mysql
Villiam_AY1 天前
一次 DNS 端口引发的代理网络和公司内网冲突问题
java·服务器·数据库
dgvri1 天前
比较Spring AOP和AspectJ
java
eggwyw1 天前
springboot和springframework版本依赖关系
java·spring boot·后端
开longlong了吗?1 天前
Luan Takeaway——大模型驱动的智能外卖管理系统( Spring Cloud、Langchain4j )
后端·spring·spring cloud·langchain
于先生吖1 天前
国际版JAVA婚恋交友系统源码:多语言适配,可商用的跨境婚恋解决方案
java·大数据·交友