Mēģinot saņemt JSON pieprasījumu un apstrādāt to, man rodas šāda kļūda:
org.codehaus.jackson.map.JsonMappingException: Nav atrasts piemērots konstruktors tipam [simple type, klase com.myweb.ApplesDO]: nevar instancēt no JSON objekta (nepieciešams pievienot/atļaut tipa informāciju?).
Šeit ir JSON, ko es mēģinu nosūtīt:
{
"applesDO" : [
{
"apple" : "Green Apple"
},
{
"apple" : "Red Apple"
}
]
}
Kontrolierī man ir šāds metodes paraksts:
@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
// Method Code
}
AllApplesDO ir ApplesDO apvalks :
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
}
}
Domāju, ka Jackson nespēj konvertēt JSON uz Java objektiem apakšklasēm. Lūdzu, palīdziet ar konfigurācijas parametriem, lai Jackson varētu konvertēt JSON par Java objektiem. Es izmantoju Spring Framework.
EDIT: Iekļauta galvenā kļūda, kas rada šo problēmu iepriekš minētajā klases paraugā - Lūdzu, apskatiet pieņemto atbildi, lai atrastu risinājumu.
Beidzot es sapratu, kur ir problēma. Tā nav Jackson konfigurācijas problēma, kā es šaubījos.
Patiesībā problēma bija ApplesDO klasē:
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
}
}
Šai klasei bija definēts pielāgots konstruktors, padarot to par noklusējuma konstruktoru. Ieviešot viltus konstruktoru, kļūda izzuda:
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() {
}
}
Tas notiek šādu iemeslu dēļ:
Jūsu iekšējai klasei jābūt definētai kā statiskai.
private static class Condition { //jackson specific
}
Iespējams, ka jūsu klasē nav noklusējuma konstruktora (ATJAUNINĀJUMS: Šķiet, ka tā nav).
private static class Condition {
private Long id;
public Condition() {
}
// Setteri un getteri
}
Iespējams, jūsu setteri nav pareizi definēti vai nav redzami (piemēram, privāts setteris).
Vai varat, lūdzu, pārbaudīt šo struktūru. Ja pareizi atceros, to var izmantot šādā veidā:
{
"applesRequest": {
"applesDO": [
{
"apple": "Green Apple"
},
{
"apple": "Red Apple"
}
]
}
}
Otrkārt, lūdzu, pievienojiet noklusējuma konstruktoru katrai klasei, tas arī varētu palīdzēt.