Spring Boot: можно валидировать конфигурационные классы с помощью аннотации
✅ Это позволяет приложению падать на старте (fail fast), если конфигурация некорректна.
#SpringBoot #JavaDev
👉 Java Portal
@Validated.@Validated
@ConfigurationProperties(prefix = "app")
public class AppProperties {
@NotBlank
private String name;
@Min(1)
@Max(60)
private int timeout;
// getters/setters
}
#SpringBoot #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3
@RestController вместо @Controller + @ResponseBody@RestController — это мета-аннотация, которая включает @ResponseBody, и затем автоматически применяется ко всем методам:@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
}
@Controller и @ResponseBody:@Controller
public class MyController {
@ResponseBody
@GetMapping("/hello")
public String hello() {
return "Hello!";
}
}
@RestController:@RestController
public class MyController {
@GetMapping("/hello")
public String hello() {
return "Hello!";
}
}
#SpringBoot #CleanCode
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
Spring Boot: Лучше использовать
#SpringBoot #JavaDev
👉 Java Portal
SpringBootTest.WebEnvironment.RANDOM_PORT вместо жёстко заданных портов в тестах, чтобы избежать конфликтов.#SpringBoot #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3
По умолчанию Spring Boot не включает stacktrace в ответах REST-сервисов. Только для целей быстрого дебага (не используйте это в production) можно включить это через конфигурационное свойство
#SpringBoot #JavaDev
👉 Java Portal
include-stacktrace: always.#SpringBoot #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Spring Boot: есть возможность использовать стриминг (Stream<T>) для запросов с большими наборами данных.
Результаты подтягиваются чанками, при этом в памяти одновременно находится только небольшая часть данных
В следующем примере есть приложение с
Метод
Важные моменты:
- Нужно использовать транзакцию, иначе соединение может закрыться раньше времени и стрим оборвётся
- Рекомендуется задать размер выборки через
- Стрим удерживает ресурсы базы данных, его обязательно нужно закрывать (через try-блок, как в примере)
#SpringBoot #JavaDev
👉 Java Portal
Результаты подтягиваются чанками, при этом в памяти одновременно находится только небольшая часть данных
В следующем примере есть приложение с
CommandLineRunner, которое сохраняет большой набор пользователей в базу данных, а затем обрабатывает данные через стрим:@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
CommandLineRunner run(UserRepository repo, UserService service) {
return args -> {
// Генерация тестовых данных
for (int i = 1; i <= 10000; i++) {
repo.save(new User("User_" + i));
}
// Обработка через стрим
service.processUsers();
};
}
}
Метод
processUsers работает в транзакции и использует метод репозитория streamAllUsers, который возвращает стрим:@Service
public class UserService {
private final UserRepository repository;
@PersistenceContext
private EntityManager em;
public UserService(UserRepository repository) {
this.repository = repository;
}
@Transactional(readOnly = true)
public void processUsers() {
AtomicInteger counter = new AtomicInteger();
try (Stream<User> stream = repository.streamAllUsers()) {
stream.forEach(user -> {
System.out.println(user.getName());
if (counter.incrementAndGet() % 100 == 0) {
em.clear();
}
});
}
}
}
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u")
Stream<User> streamAllUsers();
}Важные моменты:
- Нужно использовать транзакцию, иначе соединение может закрыться раньше времени и стрим оборвётся
- Рекомендуется задать размер выборки через
spring.jpa.properties.hibernate.jdbc.fetch_size=100, так как некоторые драйверы могут загрузить всё сразу- Стрим удерживает ресурсы базы данных, его обязательно нужно закрывать (через try-блок, как в примере)
#SpringBoot #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍2
Java: Если нужно читать небольшие файлы, можно использовать
#SpringBoot #JavaDev
👉 Java Portal
Files.readAllLines() — это более прямой и простой способ.#SpringBoot #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Boot: избегай
❌ Пометка связи как
#Springboot #РазработкаПО
👉 Java Portal
FetchType.EAGER, если в этом нет реальной необходимости.EAGER заставляет ORM загружать её при каждой загрузке сущности, независимо от того, вызываешь ли ты метод этой связи на самом деле.#Springboot #РазработкаПО
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
image_2026-04-28_06-49-08.png
2 MB
Spring Boot: эффективный способ обработки больших CSV-файлов — использовать возможности Spring Batch.
Spring Batch настраивается с такими опциями:
✅ Чанкинг
✅ Параллелизм
✅ Ретраи
#SpringBoot #РазработкаПО
👉 Java Portal
Spring Batch настраивается с такими опциями:
#SpringBoot #РазработкаПО
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣3
Spring Boot: важно валидировать входные данные ваших API, даже внутренних.
#SpringBoot #РазработкаПО
👉 Java Portal
#SpringBoot #РазработкаПО
Please open Telegram to view this post
VIEW IN TELEGRAM
👀3❤1
Spring Boot: можно добавить глобальные метаданные OpenAPI через аннотацию
✅ Её размещают на основном классе приложения Spring Boot или в отдельном конфигурационном классе.
#SpringBoot #JavaDev
👉 Java Portal
@OpenAPIDefinition.#SpringBoot #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Boot: используйте
#SpringBoot #SoftwareDevelopment
👉 Java Portal
@Async только для небольших задач на оффлоадинг и только с явно заданным исполнителем.#SpringBoot #SoftwareDevelopment
Please open Telegram to view this post
VIEW IN TELEGRAM