Ko poskušam dobiti zahtevo JSON in jo obdelati, dobim naslednjo napako:
org.codehaus.jackson.map.JsonMappingException: Ni najden noben ustrezen konstruktor za tip [simple type, razred com.myweb.ApplesDO]: ni mogoče instancirati iz objekta JSON (je treba dodati/izključiti informacije o tipu?)
Tukaj je JSON, ki ga poskušam poslati:
{
"applesDO" : [
{
"apple" : "Green Apple"
},
{
"apple" : "Red Apple"
}
]
}
V kontrolerju imam naslednjo podpisano metodo:
@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
// Method Code
}
AllApplesDO je ovitek za 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
}
}
Mislim, da Jackson ne more pretvoriti JSON v predmete Java za podrazrede. Prosim, pomagajte s konfiguracijskimi parametri za Jackson, da pretvori JSON v objekte Java. Uporabljam ogrodje Spring Framework.
EDIT: Vključen glavni hrošč, ki povzroča to težavo v zgornjem vzorčnem razredu - Prosimo, poglejte sprejeti odgovor za rešitev.
Končno sem ugotovil, v čem je težava. Ne gre za konfiguracijo Jacksona, kot sem dvomil.
Težava je bila dejansko v razredu 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
}
}
Za ta razred je bil definiran konstruktor po meri, ki je postal privzeti konstruktor. Z uvedbo navideznega konstruktorja je napaka izginila:
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() {
}
}
To se zgodi iz naslednjih razlogov:
vaš notranji razred mora biti definiran kot statični.
zasebni statični razred Condition { //specifično za Jacksona
}
Morda v vašem razredu ni privzetega konstruktorja (DOPOLNITEV: Zdi se, da to ni res).
private static class Condition {
private Long id;
public Condition() {
}
// Setters in Getters
}
Morda vaši setterji niso pravilno definirani ali pa niso vidni (npr. private setter).
Ali lahko preizkusite to strukturo. Če se prav spomnim, jo lahko uporabite na ta način:
{
"applesRequest": {
"applesDO": [
{
"apple": "Green Apple"
},
{
"apple": "Red Apple"
}
]
}
}
Drugič, prosimo, dodajte privzeti konstruktor vsakemu razredu, tudi to bi lahko pomagalo.