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

Что такое @ResponseBody?

1.0 Junior🔥 101 комментариев
#Основы Java

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

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

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

# @ResponseBody в Spring Framework

Определение

@ResponseBody — это аннотация Spring Framework, которая указывает, что возвращаемое значение метода контроллера должно быть преобразовано в тело HTTP-ответа (сериализовано) вместо использования механизма View Resolution.

Основное поведение

По умолчанию методы контроллера в Spring возвращают имя представления (view), которое затем разрешается в шаблон (JSP, Thymeleaf и т.д.). Аннотация @ResponseBody изменяет это поведение:

// Без @ResponseBody - возвращает имя шаблона
@Controller
public class UserController {
    @GetMapping("/user")
    public String getUser() {
        return "user-template"; // Возвращает шаблон user-template.jsp
    }
}

// С @ResponseBody - возвращает данные в теле ответа
@Controller
public class UserController {
    @GetMapping("/user")
    @ResponseBody
    public User getUser() {
        return new User("Ivan", "ivan@mail.com"); // Сериализуется в JSON
    }
}

Как это работает

  1. Spring вызывает метод контроллера
  2. Получает возвращаемый объект
  3. Выбирает подходящий HttpMessageConverter (обычно Jackson для JSON)
  4. Сериализует объект в JSON/XML/другой формат
  5. Устанавливает Content-Type в ответе (например, application/json)
  6. Отправляет сериализованные данные в теле ответа

Практические примеры

REST API (возврат JSON)

@Controller
@RequestMapping("/api")
public class ProductController {
    
    @GetMapping("/products/{id}")
    @ResponseBody
    public Product getProduct(@PathVariable Long id) {
        return new Product(id, "Laptop", 1000.0);
    }
    // Ответ:
    // Content-Type: application/json
    // {"id":1,"name":"Laptop","price":1000.0}
}

REST API (возврат списка)

@GetMapping("/products")
@ResponseBody
public List<Product> getAllProducts() {
    return Arrays.asList(
        new Product(1L, "Laptop", 1000.0),
        new Product(2L, "Phone", 500.0)
    );
}
// Ответ: [{...}, {...}]

Возврат не-JSON данных

@GetMapping("/data.xml")
@ResponseBody
@ResponseStatus(HttpStatus.OK)
public Product getXml() {
    return new Product(1L, "Item", 99.99);
}
// Content-Type: application/xml (если добавлен парсер XML)

@RestController (более удобная альтернатива)

С Spring 4.0+ рекомендуется использовать @RestController вместо комбинации @Controller + @ResponseBody:

// Эквивалентно @Controller + @ResponseBody на каждом методе
@RestController
@RequestMapping("/api")
public class UserController {
    
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return new User(id, "Ivan", "ivan@mail.com");
    }
}

Форматы сериализации

Формат сериализации определяется заголовком Accept в запросе и установленными HttpMessageConverters:

// Запрос с Accept: application/json
GET /api/user HTTP/1.1
Accept: application/json

// Ответ
HTTP/1.1 200 OK
Content-Type: application/json
{"id":1,"name":"Ivan"}

// Запрос с Accept: application/xml
GET /api/user HTTP/1.1
Accept: application/xml

// Ответ
HTTP/1.1 200 OK
Content-Type: application/xml
<user><id>1</id><name>Ivan</name></user>

Типичные HttpMessageConverters

  • MappingJackson2HttpMessageConverter — для JSON (требует Jackson)
  • Jaxb2RootElementHttpMessageConverter — для XML (требует JAXB)
  • StringHttpMessageConverter — для строк
  • ByteArrayHttpMessageConverter — для байт-массивов

Когда использовать

  • Разработка REST API
  • Возврат JSON/XML данных
  • Микросервисы
  • AJAX запросы
  • Когда не нужен шаблонизатор (JSP, Thymeleaf)

Резюме

@ResponseBody указывает Spring Framework сериализовать возвращаемый объект в тело HTTP-ответа вместо использования View Resolution. Для REST API рекомендуется использовать @RestController, которая автоматически применяет @ResponseBody ко всем методам.

Что такое @ResponseBody? | PrepBro