Я получаю следующую ошибку при попытке получить JSON-запрос и обработать его:
org.codehaus.jackson.map.JsonMappingException: не найден подходящий конструктор для типа [простой тип, класс com.myweb.ApplesDO]: невозможно создать экземпляр объекта JSON (нужно добавить / включить информацию о типе?)
Вот JSON, который я пытаюсь отправить:
{
"applesDO" : [
{
"apple" : "Green Apple"
},
{
"apple" : "Red Apple"
}
]
}
В контроллере у меня есть следующая подпись метода:
@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
// Method Code
}
AllApplesDO - это обертка от ApplesDO:
public class AllApplesDO {
private List<ApplesDO> applesDO;
public List<ApplesDO> getApplesDO() {
return applesDO;
}
public void setApplesDO(List<ApplesDO> applesDO) {
this.applesDO = applesDO;
}
}
ApplesDO:
public class ApplesDO {
private String apple;
public String getApple() {
return apple;
}
public void setApple(String appl) {
this.apple = apple;
}
public ApplesDO(CustomType custom){
//constructor Code
}
}
Я думаю, что Джексон не может преобразовать JSON в объекты Java для подклассов. Пожалуйста, помогите с параметрами конфигурации для Джексона для преобразования JSON в объекты Java. Я использую Spring Framework.
РЕДАКТИРОВАТЬ: Включена основная ошибка, которая вызывает эту проблему в приведенном выше примере класса - Пожалуйста, посмотрите принятый ответ для решения.
Ответы:
Итак, наконец я понял, в чем проблема. Это не проблема конфигурации Джексона, как я сомневался.
На самом деле проблема была в классе ApplesDO :
Для класса был определен пользовательский конструктор, который сделал его конструктором по умолчанию. Представление фиктивного конструктора сделало ошибку, чтобы уйти:
источник
Это происходит по следующим причинам:
Ваш внутренний класс должен быть определен как статический
Возможно, в вашем классе нет конструктора по умолчанию ( UPDATE: похоже, это не тот случай)
Это может быть ваши сеттеры не определены должным образом или не видны (например, частный сеттер)
источник
Я хотел бы добавить другое решение, которое не требует фиктивного конструктора. Поскольку фиктивные конструкторы немного запутаны и, как следствие, сбивают с толку. Мы можем предоставить безопасный конструктор и, пометив аргументы конструктора, мы позволим Джексону определить соответствие между параметром конструктора и полем.
поэтому следующее также будет работать. Обратите внимание, что строка внутри аннотации должна соответствовать имени поля.
источник
@JsonCreator
конструктор с@JsonProperty
.Когда я столкнулся с этой проблемой, это было результатом попытки использовать внутренний класс в качестве DO. Конструкция внутреннего класса (молча) требовала экземпляра окружающего класса, который не был доступен Джексону.
В этом случае перемещение внутреннего класса в собственный файл .java устранило проблему.
источник
Как правило, эта ошибка возникает из-за того, что мы не делаем конструктор по умолчанию, но в моем случае проблема возникла только из-за того, что я создал класс используемого объекта внутри родительского класса. Это потратило впустую весь мой день.
источник
static
.Правило большого пальца : Добавьте конструктор по умолчанию для каждого класса, который вы использовали в качестве класса отображения. Вы пропустили это и проблема возникла!
Просто добавьте конструктор по умолчанию, и он должен работать.
источник
Можете ли вы проверить эту структуру? Если я правильно помню, вы можете использовать это так:
Во-вторых, добавьте конструктор по умолчанию для каждого класса, это также может помочь.
источник
Вы должны создать фиктивный пустой конструктор в нашем классе модели. Так что при отображении json он устанавливается методом setter.
источник
Если вы начинаете аннотировать конструктор, вы должны аннотировать все поля.
Обратите внимание, что мое поле Staff.name отображается в «ANOTHER_NAME» в строке JSON.
источник
Вы должны понять, какие варианты есть у Джексона для десериализации. В Java имена аргументов метода отсутствуют в скомпилированном коде. Вот почему Джексон не может вообще использовать конструкторы для создания четко определенного объекта со всем уже установленным.
Таким образом, если есть пустой конструктор, а также есть сеттеры, он использует пустой конструктор и сеттеры. Если сеттеров нет, для этого используется некоторая темная магия (отражения).
Если вы хотите использовать конструктор с Джексоном, вы должны использовать аннотации, упомянутые @PiersyP в его ответе. Вы также можете использовать шаблон строителя. Если вы столкнулись с некоторыми исключениями, удачи. Обработка ошибок в Джексоне отстой, это трудно понять, что за ошибки в сообщениях об ошибках.
источник
Что касается последней публикации, у меня была та же проблема, когда использование Lombok 1.18. * Породило проблему.
Моим решением было добавить @NoArgsConstructor (конструктор без параметров), поскольку @Data по умолчанию включает @RequiredArgsConstructor (конструктор с параметрами).
Документация lombok https://projectlombok.org/features/all
Это решило бы проблему:
источник
Сбой пользовательских сериализаторов / десериализаторов Джексона также может быть проблемой. Хотя это не ваш случай, стоит упомянуть.
Я столкнулся с тем же исключением, и это было так.
источник
Для меня это работало, но обновление библиотек привело к появлению этой проблемы. Проблема в том, что у меня был такой класс:
Используя ломбок:
Отступая к
Исправлена проблема. Не уверен почему, но хотел документировать это на будущее.
источник