Skip to content
This repository was archived by the owner on Nov 7, 2019. It is now read-only.

Unable to associate parameter name with single non-annotated constructor argument #21

@michaelhixson

Description

@michaelhixson

With Jackson 2.6.0-rc2 and the parameter names module, I am running into errors when deserializing JSON into objects with one constructor argument. Here is some sample code demonstrating the issue:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;

import java.io.IOException;
import java.util.List;

public class Example {
  static class NoAnnotations {
    NoAnnotations(List<Integer> numbers) {
      System.out.println(numbers);
    }
  }

  static class CreatorOnly {
    @JsonCreator
    CreatorOnly(List<Integer> numbers) {
      System.out.println(numbers);
    }
  }

  static class CreatorAndProperty {
    @JsonCreator
    CreatorAndProperty(@JsonProperty("numbers") List<Integer> numbers) {
      System.out.println(numbers);
    }
  }

  static class PropertyOnly {
    PropertyOnly(@JsonProperty("numbers") List<Integer> numbers) {
      System.out.println(numbers);
    }
  }

  static class SecondArgument {
    SecondArgument(List<Integer> numbers, List<Integer> moreNumbers) {
      System.out.println(numbers);
    }
  }

  public static void main(String[] args) {
    String json = "{\"numbers\":[1,2,3]}";
    ObjectMapper mapper = new ObjectMapper()
        .registerModule(new ParameterNamesModule());
    try {
      // This throws.
      mapper.readValue(json, NoAnnotations.class);
    } catch (IOException e) {
      e.printStackTrace();
    }
    try {
      // This throws.
      mapper.readValue(json, CreatorOnly.class);
    } catch (IOException e) {
      e.printStackTrace();
    }
    try {
      // This is ok.
      mapper.readValue(json, CreatorAndProperty.class);
    } catch (IOException e) {
      e.printStackTrace();
    }
    try {
      // This is ok.
      mapper.readValue(json, PropertyOnly.class);
    } catch (IOException e) {
      e.printStackTrace();
    }
    try {
      // This is ok.
      mapper.readValue(json, SecondArgument.class);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Here is the output of the above.

com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class Example$None]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
 at [Source: {"numbers":[1,2,3]}; line: 1, column: 2]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1107)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:294)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:131)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3707)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2719)
    at Example.main(Example.java:47) <5 internal calls>
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of FIELD_NAME token
 at [Source: {"numbers":[1,2,3]}; line: 1, column: 2]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:850)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:846)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:288)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:227)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1096)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:294)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:131)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3707)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2719)
    at Example.main(Example.java:52) <5 internal calls>
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]

My real code most closely resembles the NoAnnotations example. Is it a bug that that example throws, or is that an expected limitation?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions