java - Jackson Json 和@JsonAnySetter 的不稳定行为

标签 java jackson jetty-9

我正在开发一个使用 Jackson 进行 Json 序列化和反序列化的 Java Web 项目。 我使用 Jetty 作为网络服务器 我正在尝试在构建时反序列化生成的类:

/**
 *Generated class at compile time
**/    
@JsonInclude(NON_NULL)
    public class SamplePayloadContent extends AbstractSamplePayload {

        @NotNull
        @JsonProperty(value = "sampleProperty", required = true)
        private String sampleProperty;

       ...
    }

我正在使用 AbstractSamplePayload 向生成的类添加属性,AbstractSamplePayload:

public abstract class AbstractSamplePayload implements Serializable {

    protected final static transient Logger logger = LoggerFactory.getInstance(AbstractSamplePayload.class.getClass());

    /**
     *
     */
    private static final long serialVersionUID = 8422742687709239202L;


    @JsonAnySetter
    public void handleUnknown(String key, Object value) {

        logger.warn(new LogMetadata(ELogIds.ABST_SAMPLE_PAYLOAD, "Missing setter for key " + key + " value " + value));
    }
}

因此,对于 @JsonAnySetterhandleUnknown 方法,我试图忽略其他属性。

之后,我尝试使用 ObjectMapper 反序列化 Json 格式的字符串:

public SamplePayloadContent buildContent(String jsonPayload) throws IOException{
     ObjectMapper objectMapper=new ObjectMapper();

     return objectMapper.readValue(jsonPayload, SamplePayloadContent.class);

}

构建项目后,反序列化在运行时一切正常,附加属性被正确忽略。

在不同的 VM 中部署 Web 存档之后,其中一些,当尝试使用之前的方法构建我们的对象时,应用程序抛出 UnrecognizedPropertyException: Unrecognized field "sampleProperty", not marked作为可忽略的虽然我们有@JsonAnySetter

通过添加一些包含 SamplePayloadContent 类的方法列表的日志来深入研究问题后,我发现存在问题的 VM 无法识别扩展方法 handleUnknown

这里的奇怪行为是所有 VM 都具有相同版本的 Java 和 Jetty 以及相同的操作系统,但是我们与其中一些的交互很糟糕。

预先感谢您的帮助。

最佳答案

正如我所说,我们在许多不同的虚拟机上运行应用程序,我们刚刚在其中一些虚拟机中遇到了问题。 我们发现另一个生成的类具有相同的名称 SamplePayloadContent 并且位于类路径中存在的同一包中,但此类不继承自 AbstractSamplePayload。第二类来自已部署应用程序使用的依赖项。

因此,在某些 VM 中,Jetty 考虑了错误的类,因此我们得到了异常,而在其他 VM 中,Jetty 考虑了正确的类,因此我们得到了预期的行为。

关于java - Jackson Json 和@JsonAnySetter 的不稳定行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59028677/

相关文章:

java - 如何从 Jackson 的序列化中排除一个集合元素?

jetty - 使用 maven-jetty-plugin 启用 HTTP2

java - 如何阻塞直到 BlockingQueue 为空?

java - 如何使用FX查看网页:ID JavaFx

java - Long.toBinaryString 未返回 827.0 的预期二进制字符串

java - Jackson XmlMapper 在将 XML 写入文件时强制使用小写标记名称

java - 使用 JDO 在 Google 数据存储区中创建实体时出错

JavaScript Date 对象总是在 America/New_York 时区打印?

Jetty 9.0 嵌入了带有 SPDY 的配置,但没有 SSL/NPN

java - Jetty 在错误的目录中搜索 webdefault.xml