Jeg får følgende feil når jeg prøver å hente en JSON-forespørsel og behandle den:
org.codehaus.jackson.map.JsonMappingException: Ingen egnet konstruktør funnet for type [enkel type, klasse com.myweb.ApplesDO]: kan ikke instansieres fra JSON-objekt (trenger du å legge til / aktivere typeinformasjon?)
Her er JSON-filen jeg prøver å sende:
{
"applesDO" : [
{
"apple" : "Green Apple"
},
{
"apple" : "Red Apple"
}
]
}
I Controller har jeg følgende metodesignatur:
@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
// Method Code
}
AllApplesDO er en innpakning av 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
}
}
Jeg tror at Jackson ikke klarer å konvertere JSON til Java-objekter for underklasser. Vennligst hjelp med konfigurasjonsparametrene for Jackson for å konvertere JSON til Java Objects. Jeg bruker Spring Framework.
EDIT: Inkludert hovedfeilen som forårsaker dette problemet i eksempelklassen ovenfor - Vennligst se akseptert svar for løsning.
Så til slutt skjønte jeg hva problemet er. Det er ikke et Jackson-konfigurasjonsproblem som jeg tvilte på.
Egentlig var problemet i ApplesDO klasse:
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
}
}
Det var en egendefinert konstruktør definert for klassen som gjorde den til standardkonstruktør. Innføring av en dummy-konstruktør har fått feilen til å forsvinne:
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() {
}
}
Dette skjer av disse grunnene:
Din indre klasse skal defineres som statisk.
private static class Betingelse { //jackson spesifikk
}
Det kan være at du ikke har noen standardkonstruktør i klassen din (OPPDATERING: Dette ser ikke ut til å være tilfelle).
private static class Betingelse {
private Long id;
public Condition() {
}
// Settere og Gettere
}
Det kan være at setterne dine ikke er riktig definert eller ikke er synlige (f.eks. private settere).
Kan du vennligst teste denne strukturen. Hvis jeg husker riktig, kan du bruke den på denne måten:
{
"applesRequest": {
"applesDO": [
{
"apple": "Green Apple"
},
{
"apple": "Red Apple"
}
]
}
}
For det andre, vennligst legg til standardkonstruktør til hver klasse, det kan også hjelpe.