为何Spring Boot库(如Spring Security)在/src/main中用断言而非异常?
Spring主代码中使用Assert工具类是否合理?
首先要明确:Spring框架中的Assert类和Java原生的assert关键字完全是两回事,这是很多人混淆的核心点。
Java原生assert默认是关闭的(需通过JVM参数-ea手动开启),确实不适合用于生产代码的参数校验——因为一旦未开启断言,校验逻辑会直接失效。但Spring的Assert是一个普通静态工具类,它的方法会直接抛出对应的运行时异常,不受JVM参数控制,本质就是封装了重复的参数校验与异常抛出逻辑。
比如你提到的OAuth2AccessToken构造方法里的Assert.notNull(tokenType, "tokenType cannot be null"),其底层实现其实是:
public static void notNull(@Nullable Object object, String message) { if (object == null) { throw new IllegalArgumentException(message); } }
这和手动编写if (tokenType == null) throw new IllegalArgumentException("tokenType cannot be null");的效果完全一致,只是用工具类简化了代码,让校验逻辑更简洁直观。
在Spring框架的主代码中使用这类Assert工具类是常规操作,目的是减少重复代码、提升代码可读性,完全符合生产代码的规范。它并不是Java原生断言,不存在“仅用于测试”的限制,也就不需要改成手动抛异常的写法。
总结:Spring主代码里的Assert是合法的参数校验封装,无需替换。
内容的提问来源于stack exchange,提问作者Bipin Kumar Chaurasia
相关产品推荐
相关产品推荐

