Enterprise Средний

Spring 7 переходит на аннотации JSpecify, делая non-null значением по умолчанию и снижая аннотационный шум.

✕ Spring 5/6
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;

public class UserService {

    @Nullable
    public User findById(@NonNull String id) {
        return repository.findById(id).orElse(null);
    }

    @NonNull
    public List<User> findAll() {
        return repository.findAll();
    }

    @NonNull
    public User save(@NonNull User user) {
        return repository.save(user);
    }
}
✓ Spring 7
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;

@NullMarked
public class UserService {

    public @Nullable User findById(String id) {
        return repository.findById(id).orElse(null);
    }

    public List<User> findAll() {
        return repository.findAll();
    }

    public User save(User user) {
        return repository.save(user);
    }
}
Заметили проблему в этом коде? Сообщите нам.
✂️

Non-null как умолчание

@NullMarked делает все неаннотированные типы non-null, так что аннотировать нужно только nullable-исключения.

🌐

Экосистемный стандарт

Аннотации JSpecify — это кросс-фреймворковый стандарт, распознаваемый NullAway, Error Prone и IDE.

🔍

Расширенная поддержка инструментами

Современные статические анализаторы понимают null-модель JSpecify и сообщают о нарушениях на этапе компиляции.

Старый подход
Spring @NonNull/@Nullable
Современный подход
JSpecify @NullMarked
Начиная с JDK
17
Сложность
Средний
Null-безопасность Spring с JSpecify
Доступно

Доступно начиная с Spring Framework 7.0 (требует Java 17+)

Spring 5 и 6 вводили собственные аннотации null-безопасности в пакете `org.springframework.lang`. Несмотря на полезность, они были специфичны для фреймворка и требовали явной аннотации каждого non-null элемента. Spring 7 переходит на JSpecify — кросс-экосистемный стандарт null-безопасности. Аннотация `@NullMarked` на уровне класса или пакета объявляет, что все неаннотированные типы являются non-null по умолчанию. Только действительно nullable типы требуют аннотации `@Nullable`, что резко снижает многословность. Аннотации JSpecify распознаются ведущими инструментами статического анализа — NullAway, Error Prone и IntelliJ IDEA — обеспечивая более широкую поддержку инструментами, чем Spring-специфичные аннотации.