3

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.

James Hutchinson
  • 841
  • 2
  • 13
  • 27

0 Answers0