Pri pokuse získať požiadavku JSON a spracovať ju dostávam nasledujúcu chybu:
JsonMappingException: > org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class com.myweb.ApplesDO]: can not instantiate from JSON object (need to add/enable type information?)
Tu je JSON, ktorý sa snažím odoslať:
{
"applesDO" : [
{
"apple" : "Green Apple"
},
{
"apple" : "Red Apple"
}
]
}
V Controlleri mám nasledujúci podpis metódy:
@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
// Method Code
}
AllApplesDO je wrapper metódy 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
}
}
Myslím, že Jackson nedokáže konvertovať JSON na objekty Java pre podtriedy. Prosím o pomoc s konfiguračnými parametrami pre Jackson na konverziu JSON na objekty Java. Používam Spring Framework.
EDIT: Zahrnutá hlavná chyba, ktorá spôsobuje tento problém vo vyššie uvedenej vzorovej triede - Prosím, pozrite si prijatú odpoveď pre riešenie.
Tak som si konečne uvedomil, v čom je problém. Nie je to problém s konfiguráciou Jacksona, ako som pochyboval.
V skutočnosti bol problém v triede 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
}
}
Pre triedu bol definovaný vlastný konštruktor, ktorý sa stal predvoleným konštruktérom. Zavedenie fiktívneho konštruktora spôsobilo, že chyba zmizla:
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() {
}
}
Deje sa tak z týchto dôvodov:
Vaša vnútorná trieda by mala byť definovaná ako statická
private static class Condition { //jackson specific
}
Je možné, že vo vašej triede nemáte žiadny predvolený konštruktor (DOPLNENIE: Zdá sa, že to nie je tento prípad)
private static class Condition {
private Long id;
public Condition() {
}
// Settery a gettery
}
Môže sa stať, že vaše settery nie sú správne definované alebo nie sú viditeľné (napr. privátny setter)
Môžete prosím otestovať túto štruktúru. Ak si dobre pamätám, môžete ju použiť týmto spôsobom:
{
"applesRequest": {
"applesDO": [
{
"apple": "Green Apple"
},
{
"apple": "Red Apple"
}
]
}
}
Po druhé, prosím, pridajte do každej triedy predvolený konštruktor, tiež by to mohlo pomôcť.