Spring Boot In Action May 2026

@Service public class UserService { @Cacheable(value = "users", key = "#id") public User findById(Long id) { return userRepository.findById(id).orElseThrow(); }

@Component public class OrderPublisher { @Autowired private RabbitTemplate rabbitTemplate;

@Component @RabbitListener(queues = "order.queue") public class OrderListener { @RabbitHandler public void handleOrder(Order order) { System.out.println("Received order: " + order.getId()); } } File Upload @PostMapping("/upload") public ResponseEntity<String> handleUpload(@RequestParam("file") MultipartFile file) throws IOException { Path path = Paths.get("uploads/" + file.getOriginalFilename()); Files.write(path, file.getBytes()); return ResponseEntity.ok("File uploaded successfully"); } // Async file processing @Async public CompletableFuture<String> processFile(MultipartFile file) { // Process large files asynchronously } 14. Error Handling Global Exception Handler @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public Map<String, String> handleValidation(MethodArgumentNotValidException ex) { return ex.getBindingResult().getFieldErrors().stream() .collect(Collectors.toMap( FieldError::getField, FieldError::getDefaultMessage )); } spring boot in action

public void publish(Order order) { rabbitTemplate.convertAndSend("order.exchange", "order.created", order); } }

@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoggingInterceptor()) .addPathPatterns("/api/**"); } } @RestController public class ReactiveUserController { @GetMapping("/flux/users") public Flux<User> getAllReactive() { return userReactiveRepository.findAll() .delayElements(Duration.ofSeconds(1)); } return ResponseEntity.ok("File uploaded successfully")

@GetMapping(value = "/stream/users", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<User> streamUsers() { return Flux.interval(Duration.ofSeconds(2)) .map(tick -> new User()); } } Basic Security Configuration @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http .authorizeHttpRequests(auth -> auth .requestMatchers("/public/**", "/api/auth/**").permitAll() .requestMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() ) .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .build(); }

@WebMvcTest(UserController.class) class UserControllerMvcTest { } } @GetMapping(value = "/stream/users"

@JsonTest class UserJsonTest { } Profile Configuration # application-dev.yml spring: datasource: url: jdbc:h2:mem:testdb jpa: show-sql: true application-prod.yml spring: datasource: url: ${DATABASE_URL} hikari: maximum-pool-size: 20 Using Profiles @Configuration @Profile("dev") public class DevConfig { } @Service @Profile("!test") public class ProductionService { }