0

I'm attempting to unmarshall a quite simple JSON string into a Java object. But I'm getting an error when using ObjectMapper to map the String to a Java object.

The error I am getting is the following

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of WebserviceDOInterface (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information at [Source: (String)"[truncated 254 chars]; line: 1, column: 203] (through reference chain: WSDomainObject["webReqDomainObject"])

I'm not quite sure how to cast this to a String due to the polymorphic aspect of the class, is there some annotations that I have to add to my classes or do I just have to set up by object mapper in a different way? Any help would be greatly apprecaited.

Here is the JSON i'm trying to cast:

{
  "webReqDomainObject": {
    "id": "601942353"
  },
  "webRespDomainObject": {
    "systemException": {
      "errorCode": "303",
      "errorMessage": "Service error encountered",
      "source": "SERVICE",
      "httpStatusCode": "500",
      "systemException": true
    },
    "profiles": null
  }
}

This is the object that I'm trying to cast the above to.

@JsonIgnoreProperties(
       ignoreUnknown = true
)
public class WSDomainObject<WSSReq extends WebserviceDOInterface, WSSResp extends WebserviceDOInterface> {
   @JsonProperty("webReqDomainObject")
   private WSSReq webReqDomainObject;
   @JsonProperty("webRespDomainObject")
   private WSSResp webRespDomainObject;

   public WSDomainObject() {
   }

   public WSSReq getWebReqDomainObject() {
      return webReqDomainObject;
   }

   public void setWebReqDomainObject(WSSReq webReqDomainObject) {
      this.webReqDomainObject = webReqDomainObject;
   }

   public WSSResp getWebRespDomainObject() {
      return webRespDomainObject;
   }

   public void setWebRespDomainObject(WSSResp webRespDomainObject) {
      this.webRespDomainObject = webRespDomainObject;
   }
}

This is all the WebserviceDOInterface is, just a marker interface.

public interface WebserviceDOInterface {
}

This is the instance of the WSSReq

WSReq

@JsonIgnoreProperties(
   ignoreUnknown = true
)
public class RetrieveRequestDomainObject implements WebserviceDOInterface {
   @JsonProperty("id")
   private String id;

   public RetrieveRequestDomainObject(String id) {
      this.id = id;
   }

   public LoyaltyAccountRetrieveRequestDomainObject() {
   }

   public String getId() {
      return this.id;
   }

   public void setId(String id) {
      this.id = id;
   }
}

This is the instance of the WSResp

@JsonIgnoreProperties(
   ignoreUnknown = true
)
public class RetrieveResponseDomainObject extends WebserviceDomainObjectResponse {
   @JsonProperty("profiles")
   private ProfilesTypeDO profiles;

   public RetrieveResponseDomainObject() {
   }

   public ProfilesTypeDO getProfiles() {
      return this.profiles;
   }

   public void setProfiles(ProfilesTypeDO profiles) {
      this.profiles = profiles;
   }
}
public abstract class WebserviceDomainObjectResponse implements WebserviceDOInterface {
   private SystemException caughtException = new SystemException();

   public WebserviceDomainObjectResponse() {
   }

   public SystemException getSystemException() {
      return this.caughtException;
   }

   public boolean isSystemException() {
      return this.caughtException.isSystemException();
   }
}
terrabl
  • 743
  • 3
  • 8
  • 23
  • Take a look at lombok, the answer here should help: https://stackoverflow.com/questions/53191468/no-creators-like-default-construct-exist-cannot-deserialize-from-object-valu – Kevin Moroney Feb 20 '23 at 20:56
  • @KevinMoroney I believe that everything has a default empty constructor (which jackson defaults too) besides the marker interface, and the error is being thrown when it's attempting to marshall the interface it looks like. – terrabl Feb 20 '23 at 21:04
  • I removed the marker interface and it worked. But I don't really want to do that... – terrabl Feb 20 '23 at 21:19

0 Answers0