Backend · Windsurf Cascade
Spring Boot 4 & Java 25 Windsurf Cascade Rules
Generate Windsurf Cascade rules for Spring Boot 4 & Java 25 in .windsurf/rules/, with the stack's conventions and checks.
- Path
- .windsurf/rules/spring-boot-4.md
- Loads
- Per-rule trigger
- Format
- Markdown with frontmatter (.md)
- Used by
- Windsurf Cascade
What this file tells the agent
Windsurf's Cascade agent reads rules from .windsurf/rules/. This rule gives Cascade the Spring Boot 4 & Java 25 conventions, commands and patterns to avoid, so its edits follow the stack instead of generic or outdated defaults.
- Use jakarta.* packages for persistence, validation, and servlets; ban legacy javax.* imports.
- Represent immutable request/response DTOs using native Java Records with Jakarta validation annotations.
- Enable virtual threads (spring.threads.virtual.enabled=true) for high-throughput blocking I/O.
- Configure Spring Security using the modern SecurityFilterChain bean approach; never extend deprecated WebSecurityConfigurerAdapter.
- Avoid N+1 queries in Spring Data JPA: use @EntityGraph or JOIN FETCH JPQL queries for relational fetches.
Code to avoid, and what to write instead
The rule steers the agent away from the left and toward the right.
// Discouraged: Legacy javax namespace, verbose POJO with setters, mutable entity exposure
import javax.persistence.*; // Obsolete since Spring Boot 3; use jakarta.persistence
public class BadOrderDTO {
private String customerId;
public void setCustomerId(String id) { this.customerId = id; }
}package com.example.demo.order;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Positive;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
public record CreateOrderRequest(
@NotBlank String customerId,
@Positive BigDecimal amount
) {}
public record OrderResponse(Long id, String customerId, BigDecimal amount) {}
@RestController
@RequestMapping("/api/v1/orders")
public class OrderController {
private final OrderService orderService;
public OrderController(OrderService orderService) {
this.orderService = orderService;
}
@PostMapping
public ResponseEntity<OrderResponse> create(@RequestBody CreateOrderRequest request) {
OrderResponse response = orderService.processOrder(request);
return ResponseEntity.ok(response);
}
}Install it in one command
- 01
Go to your project root
The file goes at .windsurf/rules/spring-boot-4.md, relative to the root.
- 02
Download the file
Run the command on the right. It downloads this preset and writes the file.
- 03
Make sure it gets used
Cascade reads rules in .windsurf/rules/ and applies this one according to its trigger.
$ mkdir -p ".windsurf/rules" && curl -fsSL "https://www.devscratchpad.tech/api/raw/windsurf-rules/spring-boot-4" -o ".windsurf/rules/spring-boot-4.md"
writes .windsurf/rules/spring-boot-4.md
.windsurf/rules/spring-boot-4.md
To write the file from your own code instead, use Read your code or Convert Legacy Rules in the editor above.
More for Spring Boot 4 & Java 25
Questions
- Where do I save this Windsurf rule?
- Save it as .windsurf/rules/spring-boot-4.md in your project. Cascade picks up rules in that folder automatically.
- When does Windsurf apply this rule?
- According to the trigger in its frontmatter: always on, on a glob match, when Cascade decides the description fits the task, or when you @-mention it.