title: Catching & Handling Jackson Exceptions with a custom message
body: <p>I'm hoping to to catch some jackson exceptions that are occurring in a spring-boot API I am developing. For example, I have the following request class and I want to catch the error that occurs when the "questionnaireResponse" key in the JSON request object is null or blank i.e <code>" "</code> in the request object.</p>
  
  <pre><code>@Validated
  @JsonRootName("questionnaireResponse")
  public class QuestionnaireResponse {
  
      @JsonProperty("identifier")
      @Valid
      private Identifier identifier = null;
  
      @JsonProperty("basedOn")
      @Valid
      private List&lt;Identifier_WRAPPED&gt; basedOn = null;
  
      @JsonProperty("parent")
      @Valid
      private List&lt;Identifier_WRAPPED&gt; parent = null;
  
      @JsonProperty("questionnaire")
      @NotNull(message = "40000")
      @Valid
      private Identifier_WRAPPED questionnaire = null;
  
      @JsonProperty("status")
      @NotNull(message = "40000")
      @NotEmptyString(message = "40005")
      private String status = null;
  
      @JsonProperty("subject")
      @Valid
      private Identifier_WRAPPED subject = null;
  
      @JsonProperty("context")
      @Valid
      private Identifier_WRAPPED context = null;
  
      @JsonProperty("authored")
      @NotNull(message = "40000")
      @NotEmptyString(message = "40005")
      @Pattern(regexp = "\\d{4}-(?:0[1-9]|[1-2]\\d|3[0-1])-(?:0[1-9]|1[0-2])T(?:[0-1]\\d|2[0-3]):[0-5]\\d:[0-5]\\dZ", message = "40001")
      private String authored;
  
      @JsonProperty("author")
      @NotNull(message = "40000")
      @Valid
      private QuestionnaireResponseAuthor author = null;
  
      @JsonProperty("source")
      @NotNull(message = "40000")
      @Valid
      private Identifier_WRAPPED source = null; //    Reference(Patient | Practitioner | RelatedPerson) resources not implemented
  
      @JsonProperty("item")
      @NotNull(message = "40000")
      @Valid
      private List&lt;QuestionnaireResponseItem&gt; item = null;
  
      public Identifier getIdentifier() {
          return identifier;
      }
  
      public void setIdentifier(Identifier identifier) {
          this.identifier = identifier;
      }
  
      public List&lt;Identifier_WRAPPED&gt; getBasedOn() {
          return basedOn;
      }
  
      public void setBasedOn(List&lt;Identifier_WRAPPED&gt; basedOn) {
          this.basedOn = basedOn;
      }
  
      public List&lt;Identifier_WRAPPED&gt; getParent() {
          return parent;
      }
  
      public void setParent(List&lt;Identifier_WRAPPED&gt; parent) {
          this.parent = parent;
      }
  
      public Identifier_WRAPPED getQuestionnaire() {
          return questionnaire;
      }
  
      public void setQuestionnaire(Identifier_WRAPPED questionnaire) {
          this.questionnaire = questionnaire;
      }
  
      public String getStatus() {
          return status;
      }
  
      public void setStatus(String status) {
          this.status = status;
      }
  
      public Identifier_WRAPPED getSubject() {
          return subject;
      }
  
      public void setSubject(Identifier_WRAPPED subject) {
          this.subject = subject;
      }
  
      public Identifier_WRAPPED getContext() {
          return context;
      }
  
      public void setContext(Identifier_WRAPPED context) {
          this.context = context;
      }
  
      public String getAuthored() {
          return authored;
      }
  
      public void setAuthored(String authored) {
          this.authored = authored;
      }
  
      public QuestionnaireResponseAuthor getAuthor() {
          return author;
      }
  
      public void setAuthor(QuestionnaireResponseAuthor author) {
          this.author = author;
      }
  
      public Identifier_WRAPPED getSource() {
          return source;
      }
  
      public void setSource(Identifier_WRAPPED source) {
          this.source = source;
      }
  
      public List&lt;QuestionnaireResponseItem&gt; getItem() {
          return item;
      }
  
      public void setItem(List&lt;QuestionnaireResponseItem&gt; item) {
          this.item = item;
      }
  }
  </code></pre>
  
  <p>Resulting in this Jackson error:</p>
  
  <pre><code>{
      "Map": {
          "timestamp": "2018-07-25T12:45:32.285Z",
          "status": 400,
          "error": "Bad Request",
          "message": "JSON parse error: Root name '' does not match expected ('questionnaireResponse') for type [simple type, class com.optum.genomix.model.gel.QuestionnaireResponse]; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Root name '' does not match expected ('questionnaireResponse') for type [simple type, class com.optum.genomix.model.gel.QuestionnaireResponse]\n at [Source: (PushbackInputStream); line: 2, column: 3]",
      "path": "/api/optumhealth/genomics/v1.0/questionnaireResponse/create"
      }
  }
  </code></pre>
  
  <p>Is there a way to catch and handle these exceptions (in the example JsonRootName is null/invalid), maybe similarly to @ControllerAdvice classes extending ResponseEntityExceptionHandler?</p>