I am getting an error Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot find a (Map) Key deserializer for type [simple type, class com.google.protobuf.Descriptors$FieldDescriptor] when I attempt to deserialize the following
{
"snmpTrapAddress":"*",
"snmpTrapPort":10162,
"newSuspectOnTrap":false,"snmpV3Users":[],
"includeRawMessage":false,
"batchSize":1000,
"queueSize":10000,
"numThreads":24,
"batchIntervalMs":500
}
with the following code:
private TrapConfigBean readTrapConfig() {
try {
URL url = this.getClass().getResource("/trapd-config.json");
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
return objectMapper.readValue(url, TrapConfigBean.class);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import generated.SnmpV3User;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"snmpTrapAddress",
"snmpTrapPort",
"newSuspectOnTrap",
"snmpV3Users",
"includeRawMessage",
"batchSize",
"queueSize",
"numThreads",
"batchIntervalMs"
})
public class TrapConfigBean implements Serializable {
@JsonProperty("snmpTrapAddress")
private String snmpTrapAddress;
@JsonProperty("snmpTrapPort")
private Integer snmpTrapPort;
@JsonProperty("newSuspectOnTrap")
private Boolean newSuspectOnTrap;
@JsonProperty("snmpV3Users")
private List<SnmpV3User> snmpV3Users = null;
@JsonProperty("includeRawMessage")
private Boolean includeRawMessage;
@JsonProperty("batchSize")
private Integer batchSize;
@JsonProperty("queueSize")
private Integer queueSize;
@JsonProperty("numThreads")
private Integer numThreads;
@JsonProperty("batchIntervalMs")
private Integer batchIntervalMs;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonProperty("snmpTrapAddress")
public String getSnmpTrapAddress() {
return snmpTrapAddress;
}
@JsonProperty("snmpTrapAddress")
public void setSnmpTrapAddress(String snmpTrapAddress) {
this.snmpTrapAddress = snmpTrapAddress;
}
@JsonProperty("snmpTrapPort")
public Integer getSnmpTrapPort() {
return snmpTrapPort;
}
@JsonProperty("snmpTrapPort")
public void setSnmpTrapPort(Integer snmpTrapPort) {
this.snmpTrapPort = snmpTrapPort;
}
@JsonProperty("newSuspectOnTrap")
public Boolean getNewSuspectOnTrap() {
return newSuspectOnTrap;
}
@JsonProperty("newSuspectOnTrap")
public void setNewSuspectOnTrap(Boolean newSuspectOnTrap) {
this.newSuspectOnTrap = newSuspectOnTrap;
}
@JsonProperty("snmpV3Users")
public List<SnmpV3User> getSnmpV3Users() {
return snmpV3Users;
}
@JsonProperty("snmpV3Users")
public void setSnmpV3Users(List<SnmpV3User> snmpV3Users) {
this.snmpV3Users = snmpV3Users;
}
@JsonProperty("includeRawMessage")
public Boolean isIncludeRawMessage() {
return includeRawMessage;
}
@JsonProperty("includeRawMessage")
public void setIncludeRawMessage(Boolean includeRawMessage) {
this.includeRawMessage = includeRawMessage;
}
@JsonProperty("batchSize")
public Integer getBatchSize() {
return batchSize;
}
@JsonProperty("batchSize")
public void setBatchSize(Integer batchSize) {
this.batchSize = batchSize;
}
@JsonProperty("queueSize")
public Integer getQueueSize() {
return queueSize;
}
@JsonProperty("queueSize")
public void setQueueSize(Integer queueSize) {
this.queueSize = queueSize;
}
@JsonProperty("numThreads")
public Integer getNumThreads() {
return numThreads;
}
@JsonProperty("numThreads")
public void setNumThreads(Integer numThreads) {
this.numThreads = numThreads;
}
@JsonProperty("batchIntervalMs")
public Integer getBatchIntervalMs() {
return batchIntervalMs;
}
@JsonProperty("batchIntervalMs")
public void setBatchIntervalMs(Integer batchIntervalMs) {
this.batchIntervalMs = batchIntervalMs;
}
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
SnmpV3User is generated from the following proto file:
syntax = "proto3";
import "google/protobuf/any.proto";
package traps;
option java_multiple_files = true;
option java_package = "generated";
message TrapConfig {
string snmp_trap_address = 1;
int32 snmp_trap_port = 2;
bool new_suspect_on_trap = 3;
bool include_raw_message = 4;
bool use_address_from_varbind = 5;
repeated SnmpV3User snmp_v3_user = 6;
ListenerConfig listener_config = 7;
}
message SnmpV3User {
string engine_id = 1;
string security_name = 2;
int32 security_level = 3;
string auth_passphrase = 4;
string privacy_passphrase = 5;
string auth_protocol = 6;
string privacy_protocol = 7;
}
message ListenerConfig {
int32 queue_size = 1;
int32 batch_size = 2;
int32 batch_interval_ms = 3;
int32 num_threads = 4;
}
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot find a (Map) Key deserializer for type [simple type, class com.google.protobuf.Descriptors$FieldDescriptor]
at [Source: (URL); line: 1, column: 1]
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1909)
at com.fasterxml.jackson.databind.deser.DeserializerCache._handleUnknownKeyDeserializer(DeserializerCache.java:603)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findKeyDeserializer(DeserializerCache.java:168)
at com.fasterxml.jackson.databind.DeserializationContext.findKeyDeserializer(DeserializationContext.java:675)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.createContextual(MapDeserializer.java:314)
at com.fasterxml.jackson.databind.DeserializationContext.handlePrimaryContextualization(DeserializationContext.java:830)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:550)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:294)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:615)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:188)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:28)
at com.fasterxml.jackson.databind.DeserializationContext.handlePrimaryContextualization(DeserializationContext.java:830)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:550)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:294)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:648)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4861)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4731)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3608)
at myMethod(TrapConfigService.java:95)
If I change snmpV3Users to a List it deserialises correctly, but I can't keep my code like that.