← Назад к вопросам

Как вызвать методы контроллера

2.3 Middle🔥 91 комментариев
#REST API и микросервисы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как вызвать методы контроллера

В Java-приложениях контроллеры — это компоненты, которые обрабатывают HTTP-запросы. Вызов методов контроллера зависит от контекста: напрямую из кода, через HTTP-запросы или через dependency injection. Рассмотрим основные подходы.

Вызов контроллера через HTTP-запросы

Это наиболее распространённый способ в Spring MVC/Boot приложениях. Контроллер определяется с помощью аннотации @RestController или @Controller, и его методы маппируются на URL-ы с помощью @RequestMapping, @GetMapping, @PostMapping и т.д.

@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        User user = userService.findById(id);
        return ResponseEntity.ok(user);
    }
    
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User savedUser = userService.save(user);
        return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
    }
}

HTTP-клиент (браузер, REST-клиент, JavaScript fetch) отправляет запрос на URL, и Spring автоматически направляет его в нужный метод контроллера.

Прямой вызов контроллера через dependency injection

Контроллер можно инъектировать как обычный bean и вызвать методы напрямую:

@Service
public class UserService {
    
    @Autowired
    private UserController userController;
    
    public User getUser(Long id) {
        // Прямой вызов метода контроллера
        ResponseEntity<User> response = userController.getUserById(id);
        return response.getBody();
    }
}

Важно: такой подход не рекомендуется, так как контроллер предназначен для обработки HTTP и может содержать HTTP-специфичную логику.

Тестирование с MockMvc

В unit/integration тестах можно использовать MockMvc для вызова методов контроллера без реального HTTP-сервера:

@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {
    
    @Autowired
    private MockMvc mockMvc;
    
    @Test
    public void testGetUser() throws Exception {
        mockMvc.perform(get("/api/users/1"))
               .andExpect(status().isOk())
               .andExpect(jsonPath("$.id").value(1));
    }
    
    @Test
    public void testCreateUser() throws Exception {
        String userJson = "{\"name\":\"John\",\"email\":\"john@example.com\"}";
        mockMvc.perform(post("/api/users")
               .contentType(MediaType.APPLICATION_JSON)
               .content(userJson))
               .andExpect(status().isCreated());
    }
}

Асинхронные контроллеры с CompletableFuture

Методы контроллера могут возвращать CompletableFuture или Mono (Reactive) для асинхронной обработки:

@RestController
public class AsyncController {
    
    @GetMapping("/async")
    public CompletableFuture<ResponseEntity<String>> asyncMethod() {
        return CompletableFuture.supplyAsync(() -> {
            // Долгая операция в отдельном потоке
            return ResponseEntity.ok("Result");
        });
    }
}

Основные моменты

  • HTTP-запрос — самый естественный способ для REST API
  • Direct call — только если контроллер не содержит HTTP-логики
  • MockMvc — для тестирования
  • Async — для неблокирующих операций
  • Interceptors/Filters — обрабатывают запросы до контроллера