@JsonCreator 和 mixin 通过模块不适用于第 3 方类

Mat*_* P. 4 java json jackson jackson-modules

我正在尝试反序列化 java.net.HttpCookie,它没有默认的无参数构造函数,并且得到: org.codehaus.jackson.map.JsonMappingException:找不到类型 [简单类型,类 java.net. HttpCookie]:无法从 JSON 对象实例化(需要添加/启用类型信息?),位于 [来源:java.io.StringReader@5a395674;行:1,列:35

这是与 jackson-mapper-asl v 1.9.13 一起使用的

我发现Jackson 3rd Party Class With No Default Constructor并尝试通过 getDeserializationConfig 和 using 模块使用他们的解决方案。我在下面展示了模块代码。

abstract class HttpCookieMixIn {
    @JsonCreator
    public HttpCookieMixIn(@JsonProperty("name") String name, @JsonProperty("value") String value) {
        logger.info("Mixin called!");
    }
}

public class MyModule extends SimpleModule {
    public MyModule() {
        super("ModuleName", new Version(0,0,1,null));
    }

    @Override
    public void setupModule(SetupContext context) {
        context.setMixInAnnotations(java.net.HttpCookie.class, HttpCookieMixIn.class);
        logger.info("Set mixin annotation");
    }
}
Run Code Online (Sandbox Code Playgroud)

在服务器端点的构造函数中,我有以下内容:

public ServerEndpointConstructor() {
    mapper = new ObjectMapper();
    mapper.registerModule(new MyModule());
}
Run Code Online (Sandbox Code Playgroud)

我看到“设置混合注释”是在我的日志中出现反序列化异常之前记录的。我没有看到“Mixin 叫了!” 曾经(尽管我不确定是否会调用 mixin 构造函数内的代码)。有人可以告诉我我的方法中的错误吗?我需要注释 java.net.HttpCookie 中的所有字段吗?

http://docs.oracle.com/javase/7/docs/api/java/net/HttpCookie.html

Mat*_* P. 6

我解决了这个问题,问题是我已将 mixin 定义为使用它的类内部的非静态内部类。将它和模块移动到自己的包中自己的类定义中修复了这个问题。或者可以将 mixin 内部类标记为“静态”来解决该问题。

感谢Jackson Mixin 没有用于反序列化非默认构造函数对象,其中作者在发布自己的问题时对此的必要性发表了评论。

  • 对我来说,即使它是内部类,使其静态也有效 (2认同)