Java 如何让jackson找到我的密钥反序列化器?

Java 如何让jackson找到我的密钥反序列化器?,java,jackson,Java,Jackson,这是我的类(省略了getter和setter): 带有AMAP的公共类{ @JsonProperty(“地图”) @JsonDeserialize(keyUsing=RangeDeserializer.class) 私人地图; @JsonCreator 公共类WitAMAP(地图){ this.map=map; } } RangeSerializer如下所示: public class RangeDeserializer extends KeyDeserializer { publi

这是我的类(省略了getter和setter):

带有AMAP的公共类{
@JsonProperty(“地图”)
@JsonDeserialize(keyUsing=RangeDeserializer.class)
私人地图;
@JsonCreator
公共类WitAMAP(地图){
this.map=map;
}
}
RangeSerializer如下所示:

public class RangeDeserializer extends KeyDeserializer {

    public ObjectMapper objectMapper() {
        return new ObjectMapper()
            .registerModules(
                new JavaTimeModule(),
                new Jdk8Module(),
                new GuavaModule(),
                new ParameterNamesModule());
    }

    @Override
    public Range<Instant> deserializeKey(String key, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        TypeReference<Range<Instant>> typeRef = new TypeReference<Range<Instant>>() {
        };
        Range<Instant> range = objectMapper().readValue(key, typeRef);
        return range;
    }
}
公共类RangeDeserializer扩展了KeyDeserializer{
公共对象映射器对象映射器(){
返回新的ObjectMapper()
.注册模块(
新的JavaTimeModule(),
新的Jdk8Module(),
新的GuavaModule(),
新参数NamesModule());
}
@凌驾
公共范围反序列化键(字符串键、反序列化上下文ctxt)
抛出IOException、JsonProcessingException{
TypeReference typeRef=新的TypeReference(){
};
Range=objectMapper().readValue(键,typeRef);
返回范围;
}
}
使用这些的主要代码是:

        Map<Range<Instant>,String> map = new HashMap<>();
        Range<Instant> key = Range.greaterThan(Instant.now());
        map.put(key, "some value");
        ClassWithAMap classWithAMap = new ClassWithAMap(map);

        String jsonInput = objectMapper()
                .writerWithDefaultPrettyPrinter()
                .writeValueAsString(classWithAMap);

        ClassWithAMap classWithMap = objectMapper()
                .readValue(jsonInput,
                ClassWithAMap.class);
Map Map=newhashmap();
Range key=Range.greaterThan(Instant.now());
map.put(key,“some value”);
ClassWithAMap ClassWithAMap=新类WITHAMAP(地图);
字符串jsonInput=objectMapper()
.writerWithDefaultPrettyPrinter()
.writeValueAsString(带有AMAP的类);
classWithMap classWithMap=objectMapper()
.readValue(jsonInput,
类与映射类);
上一条语句给出了以下错误:

InvalidDefinitionException: Cannot find a (Map) Key deserializer for type [simple type, class com.google.common.collect.Range<java.time.Instant>]
InvalidDefinitionException:找不到类型[简单类型,类com.google.common.collect.Range]的(映射)键反序列化器
当然,它从不调用我的反序列化程序。我错过了注册反序列化程序的一些步骤,尽管我将其与使用自定义类而不是
Range
的类似设置进行了比较,但是效果很好,我看不出有什么区别。有人知道我做错了什么吗?我猜这和通用型有关,但我没有进一步的说明


我正在使用jackson 2.9.9和Java 1.8。

您需要将所有注释移动到构造函数:

class ClassWithAMap {

    private Map<Range<Instant>, String> map;

    @JsonCreator
    public ClassWithAMap(
            @JsonProperty("map")
            @JsonDeserialize(keyUsing = RangeDeserializer.class)
            Map<Range<Instant>, String> map) {
        this.map = map;
    }
}
用AMAP分类{
私人地图;
@JsonCreator
使用AMAP的公共类(
@JsonProperty(“地图”)
@JsonDeserialize(keyUsing=RangeDeserializer.class)
(地图){
this.map=map;
}
}
class ClassWithAMap {

    private Map<Range<Instant>, String> map;

    @JsonCreator
    public ClassWithAMap(
            @JsonProperty("map")
            @JsonDeserialize(keyUsing = RangeDeserializer.class)
            Map<Range<Instant>, String> map) {
        this.map = map;
    }
}