Java for Beginner
675 subscribers
553 photos
156 videos
12 files
844 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Настройка сериализации данных в Spring

Сериализация данных — это процесс преобразования объектов в формат, пригодный для передачи (например, JSON или XML). В Spring сериализация используется для обмена данными между клиентом и сервером, в основном в рамках RESTful API.

Spring поддерживает сериализацию данных через такие библиотеки, как:
Jackson для JSON,
JAXB или другие парсеры для XML.


Настройка сериализации в Spring позволяет управлять тем, как данные преобразуются и передаются клиентам.

Основы сериализации данных в Spring

Использование аннотации @RestController
Аннотация @RestController позволяет автоматизировать процесс сериализации. Методы, возвращающие объекты, автоматически сериализуют их в указанный формат (например, JSON или XML).

Пример контроллера:
@RestController
@RequestMapping("/users")
public class UserController {

@GetMapping("/{id}")
public User getUser(@PathVariable int id) {
return new User(1, "John Doe", 30);
}
}


Выходной формат по умолчанию (JSON):
{
"id": 1,
"name": "John Doe",
"age": 30
}


Настройка формата ответа через заголовки

Клиент может указать, в каком формате он хочет получить данные, с помощью заголовка Accept:

Accept: application/json — вернуть JSON.
Accept: application/xml — вернуть XML.

Spring автоматически определит нужный формат, если конфигурация включает поддержку соответствующих библиотек.

Настройка сериализации в JSON

Spring использует библиотеку Jackson для работы с JSON. Она предоставляется по умолчанию, если в проект добавлен модуль spring-boot-starter-web.

Зависимость Jackson (если нужно вручную):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>


Настройка свойств через аннотации Jackson

Исключение ненужных полей: Используйте @JsonIgnore для исключения определённых полей из сериализации:
public class User {
private int id;
private String name;

@JsonIgnore
private String password;
}


Переименование полей: Используйте @JsonProperty для указания имени поля в JSON:
public class User {
@JsonProperty("user_id")
private int id;
private String name;
}


Настройка формата дат: Для работы с датами можно использовать @JsonFormat:
public class Event {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime eventDate;
}


Исключение пустых или null полей: Можно настроить глобально через файл application.properties:
spring.jackson.default-property-inclusion=non_null


Или с помощью аннотации @JsonInclude:
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
private String name;
private String email;
}


Настройка сериализации в XML

Для работы с XML используется библиотека JAXB или другие парсеры.


Зависимость JAXB:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>


Использование аннотаций JAXB


Аннотация @XmlRootElement: Указывает корневой элемент XML:
@XmlRootElement
public class User {
private int id;
private String name;

// Геттеры и сеттеры...
}


Указание имени поля в XML: Используйте @XmlElement:
public class User {
@XmlElement(name = "user_id")
private int id;
}


Исключение полей: Используйте
@XmlTransient:
public class User {
@XmlTransient
private String password;
}


#Java #Training #Spring #Serialization
Глобальная настройка сериализации

Настройка через ObjectMapper:
ObjectMapper — это основной класс Jackson для управления сериализацией и десериализацией JSON. Его можно настроить через бин в Spring:
@Configuration
public class JacksonConfig {

@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
return mapper;
}
}


Настройка глобального форматирования дат: В application.properties:
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss


Обработка ошибок при сериализации

Если при сериализации возникают ошибки, например, несоответствие типов, Spring возвращает стандартное сообщение об ошибке.
{
"timestamp": "2024-12-11T12:00:00",
"status": 400,
"error": "Bad Request",
"message": "Cannot deserialize value of type 'int' from String \"abc\""
}


Чтобы настроить собственный обработчик ошибок, можно использовать @ControllerAdvice:
@ControllerAdvice
public class CustomExceptionHandler {

@ExceptionHandler(JsonMappingException.class)
public ResponseEntity<String> handleJsonMappingException(JsonMappingException ex) {
return ResponseEntity.badRequest().body("Ошибка в JSON данных: " + ex.getMessage());
}
}


Выбор формата ответа на уровне метода

Если нужно вручную управлять форматом данных для отдельных методов, можно использовать параметр produces в аннотациях:
@GetMapping(value = "/user/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public User getUserAsJson(@PathVariable int id) {
return new User(1, "John Doe", 30);
}

@GetMapping(value = "/user/{id}", produces = MediaType.APPLICATION_XML_VALUE)
public User getUserAsXml(@PathVariable int id) {
return new User(1, "John Doe", 30);
}


Тестирование сериализации


Для проверки работы сериализации можно использовать инструменты, такие как:

Postman: отправлять запросы и проверять ответ.
Spring MockMvc: тестирование сериализации на уровне кода:

@Test
public void testJsonSerialization() throws Exception {
mockMvc.perform(get("/users/1")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("John Doe"));
}


#Java #Training #Spring #Serialization