Решено: org.springframework.http.converter.HttpMessageNotWritableException.
При разработке веб-приложений с использованием среды Spring,org.springframework.http.converter.HttpMessageNotWritableException
это распространенная ошибка。В этой статье будет представлен углубленный анализ предыстории этой ошибки.、возможные причины,И приведите примеры кодов ошибок и их решения.
Развивающаяся весна BootПри подаче заявления,Нам часто нужнообъект Преобразовать вJSONформатировать и возвращать клиенту。когдаSpringизHttpMessageConverter
Не удалось конвертироватьобъект Преобразовать вJSONчас,броситHttpMessageNotWritableException
。Это исключение обычно возникает при использовании@RestController
аннотацияиз控制устройствометод中返回объектчас。
Допустим, у нас есть простой RESTful API, который возвращает информацию о пользователе:
@RestController
public class UserController {
@GetMapping("/user")
public User getUser() {
User user = new User();
user.setId(1);
user.setName("John Doe");
user.setEmail("john.doe@example.com");
return user;
}
}
В этом примере,Если возникла проблема с некоторыми полями или методами в Userобъекте,может привести кHttpMessageNotWritableException
。
Возвращаемый тип объекта не поддерживается преобразователями JSON, такими как Jackson, или в объекте есть типы, которые невозможно сериализовать.
Некоторые типы полей в объекте не совпадают или существуют циклические зависимости, которые приводят к бесконечной рекурсии.
Конфигурация Джексона неверна, например, не указан конструктор по умолчанию или в полях имеются аннотации, препятствующие сериализации.
Ниже приводится возможная причинаHttpMessageNotWritableException
из错误代码Пример:
public class User {
private int id;
private String name;
private String email;
private Address address;
// getter и setter Метод опущен
// Класс Address здесь не реализует интерфейс Serializable.
public class Address {
private String street;
private String city;
// getter и setter Метод опущен
}
}
В этом примере,потому чтоAddress
Класс не реализованSerializable
интерфейс,JacksonНе могущийсериализацияUser
объект,таким образом бросаяHttpMessageNotWritableException
。
Чтобы правильно устранить эту ошибку, нам необходимо убедиться, что все вложенные объекты можно сериализовать. Вот исправленный пример кода:
import java.io.Serializable;
public class User implements Serializable {
private int id;
private String name;
private String email;
private Address address;
// getter и setter Метод опущен
// Убедитесь, что класс Address реализует интерфейс Serializable.
public static class Address implements Serializable {
private String street;
private String city;
// getter и setter Метод опущен
}
}
убеждатьсяAddress
класс реализованSerializable
интерфейс后,HttpMessageConverter
может быть правильноUser
объектсериализациядляJSONформатировать и возвращать клиенту。
убеждаться所有需要被сериализацияиз类都实现Serializable
интерфейс或其他сериализациямеханизм。
Избегайте циклических зависимостей между объектами,приводит к бесконечной рекурсии。Можно использовать@JsonManagedReference
и@JsonBackReference
аннотацияуправлять двусторонними отношениями。
Обязательно используйте правильную аннотацию для управления процессом сериализации JSON.,Например@JsonIgnore
、@JsonProperty
ждать。
В соответствии с потребностями проекта, Правильно настройте Джексона,Например自定义сериализацияустройствоипротивоположныйсериализацияустройство,или используйте@JsonSerialize
и@JsonDeserialize
аннотация。
Благодаря приведенному выше анализуи Пример,Я надеюсь, что читатели смогут легко понять и решитьHttpMessageNotWritableException
вопрос。В реальном развитии,При возникновении подобных проблем,可以参考本文из思路иметод,Провести устранение неполадокиисправление。