This repository was archived by the owner on Nov 7, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 18
Unable to associate parameter name with single non-annotated constructor argument #21
Copy link
Copy link
Closed
Description
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
Labels
No labels