К основному содержанию
правило

spring — правило для Cursor: что делает и как установить

Правило подсказывает, как организовать Spring Boot-код, внедрять зависимости и обрабатывать типичные проблемы. Пригодится, когда агент пишет или пересматривает Java-код проекта.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/spring.mdc
Открыть на GitHub

Что делает spring

Правило охватывает структуру пакетов и конфигурационных классов, внедрение зависимостей через конструктор и неизменяемые модели данных. Оно также предлагает загружать связанные данные без N+1 запросов и проверять пользовательский ввод на границе API.

Для ошибок описан общий обработчик через @ControllerAdvice; автоматическую конфигурацию советуют отключать лишь при необходимости. В примерах записи приведены для Java, включая record из Java 16+. Это правило для файлов **/*.java, а не руководство по настройке всего проекта.

Какие задачи решает

  • разнести bean-конфигурацию по отдельным классам
  • заменить внедрение зависимостей через поля на конструктор
  • устранить N+1 запросы при загрузке связанных данных
  • добавить проверку входных данных на границе API
  • свести обработку исключений к общему обработчику

Примеры запросов агенту

  • Проверь Java-код на соответствие правилу Spring Boot и предложи конкретные исправления.
  • Переработай этот сервис: замени внедрение через поле на конструктор и устрани N+1 запросы.
  • Проверь API-метод создания пользователя: добавь валидацию входных данных и учти глобальную обработку ошибок.

Как установить spring

Вручную: положить файлы

.cursor/rules/spring.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Вопросы о spring

Как установить spring в Cursor?

Добавьте файл правила по пути .cursor/rules/spring.mdc.

Что делает правило spring?

Оно задаёт рекомендации по структуре Spring Boot-приложения, внедрению зависимостей, валидации запросов и обработке ошибок.

Можно ли использовать record для DTO?

В примерах правило предлагает неизменяемые DTO через record и указывает Java 16+.

Исходный текст

spring.mdc · CC0-1.0
---
description: Definitive guidelines for building robust, maintainable, and performant Spring Boot applications using modern best practices.
globs: **/*.java
---
# Spring Best Practices

This guide outlines essential best practices for developing with Spring Boot, ensuring your applications are well-structured, performant, secure, and easily testable.

## 1. Code Organization and Structure

Maintain a clean, logical package structure.

### 1.1. Base Package and `@SpringBootApplication`

Place your main application class at the root of a well-named base package. All components should reside within this base package or its sub-packages.

❌ BAD:
```java
// com.example.Application.java
package com.example; // Too generic, or in default package
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
```

✅ GOOD:
```java
// com.company.project.MyApplication.java
package com.company.project; // Specific base package
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApplication { // Clear application entry point
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
```

### 1.2. Configuration Classes

Group related bean definitions into dedicated `@Configuration` classes.

❌ BAD:
```java
// MyApplication.java (monolithic config)
@SpringBootApplication
public class MyApplication {
    // ...
    @Bean
    public DataSource dataSource() { /* ... */ }
    @Bean
    public RestTemplate restTemplate() { /* ... */ }
}
```

✅ GOOD:
```java
// com.company.project.config.DataSourceConfig.java
@Configuration
public class DataSourceConfig {
    @Bean
    public DataSource dataSource() { /* ... */ }
}

// com.company.project.config.WebClientConfig.java
@Configuration
public class WebClientConfig {
    @Bean
    public WebClient webClient(WebClient.Builder builder) {
        return builder.baseUrl("http://api.example.com").build();
    }
}
```

## 2. Common Patterns and Anti-patterns

### 2.1. Constructor Injection

Always prefer constructor injection for mandatory dependencies. It ensures immutability and testability.

❌ BAD:
```java
@Service
public class UserService {
    @Autowired // Field injection is discouraged
    private UserRepository userRepository;

    public User findById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}
```

✅ GOOD:
```java
@Service
public class UserService {
    private final UserRepository userRepository; // Immutable

    @Autowired // Optional for single constructor in Spring 4.3+
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User findById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}
```

### 2.2. Immutable Data Models

Use immutable classes for DTOs and entities where possible, especially for value objects.

❌ BAD:
```java
public class UserDto { // Mutable
    private Long id;
    private String name;
    // Getters and Setters
}
```

✅ GOOD:
```java
public record UserDto(Long id, String name) {} // Immutable record (Java 16+)
// Or with Lombok:
@Value // All-args constructor, getters, equals, hashCode, toString
public class UserDto {
    Long id;
    String name;
}
```

## 3. Performance Considerations

### 3.1. N+1 Query Problem

Avoid N+1 queries by eagerly fetching related data when necessary.

❌ BAD:
```java
@Service
public class OrderService {
    @Autowired private OrderRepository orderRepository;
    public List<Order> getOrdersWithItems() {
        List<Order> orders = orderRepository.findAll();
        orders.forEach(order -> order.getItems().size()); // N+1 queries for items
        return orders;
    }
}
```

✅ GOOD:
```java
@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
    @Query("SELECT o FROM Order o JOIN FETCH o.items") // Eagerly fetch items
    List<Order> findAllWithItems();
}

@Service
public class OrderService {
    @Autowired private OrderRepository orderRepository;
    public List<Order> getOrdersWithItems() {
        return orderRepository.findAllWithItems(); // Single query
    }
}
```

## 4. Common Pitfalls and Gotchas

### 4.1. Disabling Auto-configuration

Only disable auto-configuration when strictly necessary to avoid unexpected behavior.

❌ BAD:
```java
// Always disabling specific auto-configs without understanding impact
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class MyApplication { /* ... */ }
```

✅ GOOD:
```java
// Only disable when you provide your own explicit configuration
// and the auto-config conflicts or is unwanted.
// For example, if you manage DataSource manually:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication { /* ... */ }
```

## 5. Security Best Practices

### 5.1. Input Validation

Always validate user input at the API boundary. Use Spring's validation features.

❌ BAD:
```java
@PostMapping("/users")
public ResponseEntity<UserDto> createUser(@RequestBody UserDto userDto) {
    // No validation, directly use userDto
    userService.save(userDto);
    return ResponseEntity.ok(userDto);
}
```

✅ GOOD:
```java
@PostMapping("/users")
public ResponseEntity<UserDto> createUser(@Valid @RequestBody UserDto userDto) {
    // @Valid triggers validation based on JSR-303 annotations in UserDto
    userService.save(userDto);
    return ResponseEntity.ok(userDto);
}

// In UserDto:
public record UserDto(@NotNull Long id, @NotBlank @Size(min = 2, max = 50) String name) {}
```

## 6. Error Handling

### 6.1. Global Exception Handling

Use `@ControllerAdvice` for consistent global error handling.

❌ BAD:
```java
@RestController
public class UserController {
    // ...
    @GetMapping("/{id}")
    public UserDto getUser(@PathVariable Long id) {
        try {
            return userService.findById(id);
        } catch (UserNotFoundException e) {
            throw new ResponseStatusException(HttpStatus.NOT_FOUND, "User not found", e);
        }
    }
}
```

✅ GOOD:
```java
@RestControllerAdvice // Global exception handler
public class GlobalExceptionHandler {
    @ExceptionHandler(UserNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ErrorResponse handleUserNotFound(UserNotFoundException ex) {
        return new ErrorResponse("USER_NOT_FOUND", ex.getMessage());
    }
}

// In UserController:
@RestController
public class UserController {
    // ...
    @GetMapping("/{id}")
    public UserDto getUser(@PathVariable Long id) {
        return userService.findById(id); // Let exception propagate
    }
}
// Custom exception:
public class UserNotFoundException extends RuntimeException { /* ... */ }
public record ErrorResponse(String code, String message) {}
```

## 7. API Design

### 7.1. RESTful Principles and DTOs

Design REST APIs following standard principles and use DTOs to decouple internal models from external API contracts.

❌ BAD:
```java
@RestController
@RequestMapping("/products")
public class ProductController {
    @Autowired private ProductService productService;

    @GetMapping("/{id}")
    public Product getProduct(@PathVariable Long id) { // Exposing internal entity
        return productService.findById(id);
    }
}
```

✅ GOOD:
```java
@RestController
@RequestMapping("/api/v1/products") // Versioned API path
public class ProductController {
    @Autowired private ProductService productService;

    @GetMapping("/{id}")
    public ProductResponseDto getProduct(@PathVariable Long id) {
        Product product = productService.findById(id);
        return ProductMapper.toDto(product); // Map to DTO
    }
}

public record ProductResponseDto(Long id, String name, BigDecimal price) {}
// ProductMapper is a utility to convert Product entity to ProductResponseDto
```

## 8. Testing Approaches

### 8.1. Layered Testing

Use specific Spring Boot test annotations for different layers.

❌ BAD:
```java
@SpringBootTest // Heavy for simple unit tests
public class UserServiceTest {
    @Autowired private UserService userService;
    // ...
}
```

✅ GOOD:
```java
// Unit test for service layer (mocking dependencies)
@ExtendWith(MockitoExtension.class)
public class UserServiceUnitTest {
    @Mock private UserRepository userRepository;
    @InjectMocks private UserService userService;

    @Test
    void findById_shouldReturnUser() {
        // ...
    }
}

// Integration test for web layer (no full context)
@WebMvcTest(UserController.class)
public class UserControllerWebMvcTest {
    @Autowired private MockMvc mockMvc;
    @MockBean private UserService userService; // Mock service dependency

    @Test
    void getUser_shouldReturnOk() throws Exception {
        // ...
    }
}

// Integration test for data layer
@DataJpaTest
public class UserRepositoryIntegrationTest {
    @Autowired private TestEntityManager entityManager;
    @Autowired private UserRepository userRepository;

    @Test
    void findById_shouldReturnProduct() {
        // ...
    }
}

// Full application context test (use sparingly)
@SpringBootTest
@AutoConfigureMockMvc
public class MyApplicationIntegrationTest {
    @Autowired private MockMvc mockMvc;
    // ...
}
```

© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc

Похожие правила IDE

Все правила IDE по теме «Бэкенд и API» →
spring-boot-test-patterns giuseppe-trisciuoglio Скилл подсказывает агенту, как писать тесты Spring Boot: юнит-тесты с Mockito, срезы @DataJpaTest и @WebMvcTest, интеграционные с Testcontainers. CX Codex +1 4 300установок spring-boot-crud-patterns giuseppe-trisciuoglio Скилл собирает полный CRUD-слой для сервисов на Spring Boot 3: агрегаты, JPA-репозитории, DTO и REST-контроллеры по feature-архитектуре. CX Codex +1 3 900установок java-spring-boot pluginagentmarketplace Скилл помогает создавать бэкенд на Spring Boot 3: настраивать REST API, аутентификацию через Spring Security, доступ к базам через Spring Data и мониторинг Actuator. CX Codex +1 11 800установок spring-boot-engineer https://github.com/Jeffallan Разворачивает архитектуру Spring Boot 3.x, контроллеры, репозитории Spring Data JPA и правила Spring Security 6. Пригодится при сборке REST API, реактивных сервисов и микросервисов на Java. CX Codex +1 8 400установок spring-boot Mindrally Скилл задаёт агенту стиль кода на Spring Boot: REST-контроллеры, тесты, безопасность, сборка и деплой. Пригодится, когда проект на Java и хочется единообразия. CX Codex +1 832установок spring-framework Mindrally Скилл задаёт агенту правила разработки на Spring Framework и Spring Boot: структура слоёв, внедрение зависимостей, тесты, REST. CX Codex +1 731установок

Из того же набора240

Весь набор →
statsmodels Задаёт стандарты работы со statsmodels в Python: оформление формул, добавление константы регрессии и воспроизводимые тесты моделей. ★ 3 580звёзд репо sqlite Правило задаёт Cursor практики для схем SQLite, запросов, транзакций и защиты от SQL-инъекций. Пригодится при работе с локальной базой. ★ 3 580звёзд репо sqlalchemy Правило для Cursor задаёт стиль SQLAlchemy 2.x: типизированные модели, сессии через контекстный менеджер, select() вместо устаревшего Query. ★ 3 580звёзд репо springboot Настраивает Cursor на стандарты Spring Boot 3.x и Java 17+. Помогает генерировать чистую доменную архитектуру, DTO и обработку ошибок. ★ 3 580звёзд репо sphinx Правило задаёт Cursor порядок работы с документацией Python: структура docs/, MyST, docstring в стиле Google и автогенерация API. Пригодится, когда проект уже оброс модулями, а документация живёт в голове автора. ★ 3 580звёзд репо spacy Задаёт Cursor правила работы со spaCy в коде Python: требует аннотации типов, пакетную обработку через nlp.pipe и декларативные конфиги. ★ 3 580звёзд репо solidjs Правило задаёт практики для SolidJS 1.x: реактивность, компоненты, состояние и очистка ресурсов. Применяется к JavaScript и JSX-файлам. ★ 3 580звёзд репо solidity Правило задаёт стиль и требования к Solidity-коду: фиксированный pragma, кастомные ошибки, защита от реентрантности. Пригодится, когда пишете контракты в Cursor. ★ 3 580звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой