Возвращение строки в формате JSON в Spring MVC Rest Controller
Быстрый ответ
В Spring MVC, чтобы вернуть строку в формате JSON используя RestController, необходимо применить аннотации @RestController
и @GetMapping
, а также указать атрибут produces
в качестве MediaType.APPLICATION_JSON_VALUE
. Вот пример:
@RestController
public class SimpleController {
@GetMapping(value = "/stringAsJson", produces = MediaType.APPLICATION_JSON_VALUE)
public String getStringAsJson() {
return "{\"message\":\"Привет, мир!\"}";
}
}
Этот метод отвечает строкой в формате JSON по адресу /stringAsJson
. Аннотация @RestController
освобождает от необходимости дополнительного использования @ResponseBody
.
Однако существует более изящное решение, оно избавляет от необходимости вручную формировать строки JSON. Давайте рассмотрим его подробно.
Лучшие практики возвращения строки в формате JSON
Запаковка строки в объект
Не нужно руками экранировать кавычки:
@RestController
public class ClassResponseController {
@GetMapping("/classStringAsJson")
public Response getMessage() {
return new Response("Когда жизнь дарит тебе классы, создавай объекты.");
}
static class Response {
private String message;
public Response(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
}
Использование ResponseEntity
ResponseEntity дает больше возможностей для управления:
@RestController
public class ResponseEntityController {
@GetMapping("/responseEntityAsString")
public ResponseEntity<String> getResponseEntityAsString() {
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(JSONObject.quote("Когда жизнь дарит тебе лимоны, преврати их в JSON!"));
}
}
Метод JSONObject.quote()
обеспечивает правильное преобразование строки в валидный JSON.
Преобразование в JSON с использованием Collections.singletonMap
Этот метод идеально подходит для объектов JSON с одной парой ключ-значение:
@RestController
public class SingletonMapController {
@GetMapping("/singletonMap")
public Map<String, String> getSingletonMap() {
return Collections.singletonMap("message", "Привет, одиночный мир!");
}
}
Настройка обработчиков сообщений
Настройка обработчиков сообщений позволяет полностью контролировать преобразование JSON:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// Здесь можно настроить порядок использования конвертеров, например, отдавать предпочтение Jackson перед StringHttpMessageConverter
}
}
Визуализация
Хотите получить JSON по аналогии с блюдом от шеф-повара? Используйте следующий код:
@RestController
public class MasterChefController {
@GetMapping("/chickenTikka")
public ResponseEntity<String> getChickenTikka() {
return ResponseEntity.ok("{\"message\":\"Чикен Тикка\"}"); // Шеф подает прямо в JSON
}
}
На выходе получаем:
Ответ: {"message":"Чикен Тикка"}
Это словно шеф-повар, который накормит вас блюдом, аккуратно упакованным в JSON.
Освоение искусства работы с JSON
Совместимость с RestyGWT
Если вы используете RestyGWT, убедитесь в том, что ваш JSON соответствует всем требованиям:
@GetMapping(value = "/restyGwtFriendly", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> getRestyGWTCompatibleString() {
return ResponseEntity.ok(new JSONObject(Map.of("response", "С уважением к Rest(yGWT)!")));
}
Отладка – простое как кетчуп с фри
Logger станет вашим надежным инструментом при отладке:
private static final Logger logger = LoggerFactory.getLogger(YourController.class);
@GetMapping("/loggableStringAsJson")
public Map<String, String> getLoggableStringAsJson(HttpServletRequest request) {
logger.info("Получен запрос от {}", request.getRemoteAddr());
return Collections.singletonMap("response", "Запрос обработан! Привет, мир!");
}
Тонкая настройка обработки контента
Возведите договоренность о содержимом до уровня VIP:
@GetMapping("/negotiatedStringAsJson")
public ResponseEntity<String> getNegotiatedStringAsJson() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return new ResponseEntity<>("{\"message\":\"Искусство переговоров в стиле JSON!\"}", headers, HttpStatus.OK);
}
Пользовательское преобразование в JSON
Выборочно настройте конвертеры для точного соответствия JSON:
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof StringHttpMessageConverter);
// Здесь вы можете установить использование усиленного конвертера Jackson для обработки JSON
}
Полезные материалы
- Создание RESTful-веб-сервиса с использованием Spring Boot Actuator — руководство по созданию сервисов на основе Spring Boot и Actuator.
- Spring Boot – Возвращение JSON из RESTful-сервиса — практическая инструкция по созданию RESTful-сервиса, возвращающего JSON, в Spring Boot.
- Работа с данными из MySQL в Spring Boot — введение в работу с базой данных MySQL в приложениях Spring Boot.
- Примеры аннотаций Jackson — погружение в мир магии аннотаций Jackson в приложениях Spring.
- Тестирование структуры Spring MVC – Тестирование REST API — освоение техник тестирования REST API в контексте Spring MVC.