JsonMappingException: No suitable constructor found for type [simple type, class ]: can not instantiate from JSON object

2.5K    Asked by VanessaMarshall in Devops , Asked on Jul 1, 2021

 I am getting the following error “no suitable constructor found for type” when trying to get a JSON request and process it:

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class com.myweb.ApplesDO]: can not instantiate from a JSON object (need to add/enable type information?)

Here is the JSON I am trying to send:

{
  "applesDO" : [
    {
      "apple" : "Green Apple"
    },
    {
      "apple" : "Red Apple"
    }
  ]
}
In Controller, I have the following method signature:
@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
    // Method Code
}
AllApplesDO is a wrapper of ApplesDO :
public class AllApplesDO {
    private List applesDO;
    public List getApplesDO() {
        return applesDO;
    }
    public void setApplesDO(List 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
    }
}

I think that Jackson is unable to convert JSON into Java objects for subclasses. Please help with the configuration parameters for Jackson to convert JSON into Java Objects. I am using Spring Framework.

EDIT: Included the major bug that is causing this problem in the above sample class - Please look accepted answer for a solution.

Answered by Neeraj Nair

The problem isn't with the Jackson configuration

Actually, the obstacle was in ApplesDO Class:

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
    }
}

There was a custom constructor set for the class executing it the default constructor. Preceding a dummy constructor has made the failure to go away:

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() {
    }
}

Your Answer

Interviews

Parent Categories