Version of libraries:
* google-api-services-logging: v2-rev20210709-1.32.1
* jackson-core/databind/annotations: 2.11.2
* Not using Spring or Lombok

I'm attempting to deserialize 
com.google.api.services.logging.v2.model.LogEntry using ObjectMapper 
however I'm seeing this exception.  It's trying to map the subclasses in 
LogEntry to a Map and fails.  Note this is just an example of it trying to 
map the operation section of the JSON.  If it attempts it for the other 
subclasses (depending on the JSON logs) its the same exception albeit with 
the different fields.

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not set 
com.google.api.services.logging.v2.model.LogEntryOperation field 
com.google.api.services.logging.v2.model.LogEntry.operation to 
java.util.LinkedHashMap (through reference chain: 
com.google.api.services.logging.v2.model.LogEntry["operation"]) at 
com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:397)
 
at 
com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:356)
 
at 
com.fasterxml.jackson.databind.deser.std.ContainerDeserializerBase.wrapAndThrow(ContainerDeserializerBase.java:181)
 
at 
com.fasterxml.jackson.databind.deser.std.MapDeserializer._readAndBindStringKeyMap(MapDeserializer.java:552)
 
at 
com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:377)
 
at 
com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:29)
 
at 
com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4524)
 
at 
com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3503) 
at 
com.abc.logging.data.parsing.LogEntryParser.parse(LogEntryParser.java:81) 
... 28 more Caused by: java.lang.IllegalArgumentException: Can not set 
com.google.api.services.logging.v2.model.LogEntryOperation field 
com.google.api.services.logging.v2.model.LogEntry.operation to 
java.util.LinkedHashMap at 
java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
 
at 
java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
 
at 
java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
 
at java.base/java.lang.reflect.Field.set(Field.java:780) at 
com.google.api.client.util.FieldInfo.setFieldValue(FieldInfo.java:275) at 
com.google.api.client.util.FieldInfo.setValue(FieldInfo.java:231) at 
com.google.api.client.util.GenericData.put(GenericData.java:98) at 
com.google.api.client.util.GenericData.put(GenericData.java:43) at 
com.fasterxml.jackson.databind.deser.std.MapDeserializer._readAndBindStringKeyMap(MapDeserializer.java:547)
 
... 33 more

Given LogEntry is part of the Google logging v2 library I don't have access 
to add annotations but assumed it was fine given it extends GenericJson.  
The deserialization is pretty straight forward with:

byte[] data = jsonString.getBytes();
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(new ByteArrayInputStream(data), LogEntry.class);

I understand Jackson will default to a LinkedHashMap when it doesn't know 
what to deserialize to.  Given this I attempted to use a mixin class like 
so to map these specific subclasses:

public abstract class LogEntryMixin {
@JsonDeserialize(using = LogEntryHttpRequestDeserializer.class)
private HttpRequest httpRequest;

@JsonDeserialize(using = LogEntryResourceMetadataDeserializer.class)
private MonitoredResourceMetadata metadata; 

@JsonDeserialize(using = LogEntryResourceDeserializer.class)
private MonitoredResource resource; 

@JsonDeserialize(using = LogEntryOperationDeserializer.class)
private LogEntryOperation operation; 

@JsonDeserialize(using = LogEntrySourceLocationDeserializer.class)
private LogEntrySourceLocation sourceLocation;
}

And then I add it to the mapper like so:

byte[] data = jsonString.getBytes();
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(LogEntry.class, LogEntryMixin.class);
mapper.readValue(new ByteArrayInputStream(data), LogEntry.class);

However it doesn't seem to honor the mixin JsonDeserialize annotations I've 
added.

Has anyone else come across a similar issue?  Any help would be 
appreciated.  Thanks.

-- 
You received this message because you are subscribed to the Google Groups 
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jackson-user/4d15b64d-5d9d-4882-a023-b827254914cbn%40googlegroups.com.

Reply via email to