Bezpieczeństwo null w Spring z JSpecify
Spring 7 przyjmuje adnotacje JSpecify, czyniąc non-null wartością domyślną i redukując szum adnotacji.
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);
}
}
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 jako domyślny
@NullMarked sprawia, że wszystkie nieadnotowane typy są non-null, więc tylko wyjątki nullable wymagają adnotacji.
Standard ekosystemu
Adnotacje JSpecify to standard niezależny od frameworka, rozpoznawany przez NullAway, Error Prone i IDE.
Bogatsze narzędzia
Nowoczesne analizatory statyczne rozumieją model null JSpecify i raportują naruszenia w czasie kompilacji.
Dostępne od Spring Framework 7.0 (wymaga Java 17+)
Spring 5 i 6 wprowadziły własne adnotacje bezpieczeństwa null w pakiecie org.springframework.lang. Choć użyteczne, były specyficzne dla frameworka i wymagały adnotowania każdego elementu non-null jawnie. Spring 7 migruje do JSpecify, uniwersalnego standardu dla bezpieczeństwa null. Adnotacja @NullMarked na poziomie klasy lub pakietu deklaruje, że wszystkie nieadnotowane typy są domyślnie non-null. Tylko faktycznie nullable typy wymagają adnotacji @Nullable, drastycznie redukując rozwlekłość. Adnotacje JSpecify są rozpoznawane przez główne narzędzia analizy statycznej jak NullAway, Error Prone i IntelliJ IDEA.