Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I am getting the following error 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 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> 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     } } 

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 solution.

like image 390
Lucky Murari Avatar asked Oct 02 '11 10:10

Lucky Murari


1 Answers

So, finally I realized what the problem is. It is not a Jackson configuration issue as I doubted.

Actually the problem 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 defined for the class making it the default constructor. Introducing a dummy constructor has made the error 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() {     }  } 
like image 107
Lucky Murari Avatar answered Sep 23 '22 02:09

Lucky Murari