Получавам следната грешка, когато се опитвам да получа JSON заявка и да я обработя:
org.codehaus.jackson.map.JsonMappingException: Не е намерен подходящ конструктор за типа [simple type, class 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 обекти за подкласовете. Моля, помогнете с конфигурационните параметри за Jackson да конвертира JSON в Java обекти. Използвам Spring Framework.
EDIT: Включен е основният бъг, който причинява този проблем в горния примерен клас - Моля, погледнете приетия отговор за решение.
И така, най-накрая разбрах какъв е проблемът. Това не е проблем с конфигурацията на Jackson, както се съмнявах.
Всъщност проблемът е в класа ApplesDO:
public class ApplesDO {
private String apple;
public String getApple() {
return apple;
}
public void setApple(String apple) {
this.apple = apple;
}
public ApplesDO(CustomType custom) {
//constructor Code
}
}
За класа беше дефиниран потребителски конструктор, който го правеше конструктор по подразбиране. Въвеждането на фиктивен конструктор накара грешката да изчезне:
public class ApplesDO {
private String apple;
public String getApple() {
return apple;
}
public void setApple(String apple) {
this.apple = apple;
}
public ApplesDO(CustomType custom) {
//constructor Code
}
//Introducing the dummy constructor
public ApplesDO() {
}
}
Това се случва по следните причини:
вашият вътрешен клас трябва да бъде дефиниран като статичен
частен статичен клас Condition { // специфичен за Джаксън
}
Възможно е да нямате конструктор по подразбиране в класа си (ДОПЪЛНЕНИЕ: Изглежда, че случаят не е такъв)
private static class Condition {
private Long id;
public Condition() {
}
// Установяващи и получаващи елементи
}
Възможно е сетърите ви да не са дефинирани правилно или да не са видими (напр. private setter)
Можете ли да тествате тази структура. Ако си спомням правилно, можете да я използвате по този начин:
{
"applesRequest": {
"applesDO": [
{
"apple": "Green Apple"
},
{
"apple": "Red Apple"
}
]
}
}
Второ, моля, добавете конструктор по подразбиране към всеки клас, това също може да помогне.