Jackson Json和@JsonAnySetter的不稳定行为

问题描述 投票:3回答:1

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

/**
 *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);

}

构建项目后,通过反序列化,一切在运行时都可以正常工作,其他属性将被正确忽略。

在将Web存档部署到不同的VM之后,其中一些,当尝试使用先前的方法构建对象时,尽管我们拥有UnrecognizedPropertyException: Unrecognized field "sampleProperty" , not marked as ignorable,但应用程序仍会抛出@JsonAnySetter。>>

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

这里的怪异行为是,所有VM都具有相同版本的Java和Jetty,并且具有相同的OS,但是与[[其中一些]的交互却很差。]

感谢您的帮助。

我正在使用Jackson进行Json序列化和反序列化的Java Web项目。我正在使用Jetty作为Web服务器,正在尝试在构建时反序列化生成的类:/ ** * ...

java jackson jetty-9
1个回答
0
投票
正如我说的,我们正在许多不同的VM上运行该应用程序,而我们刚刚在其中一些中遇到了问题。我们在类路径中存在的同一个包中找到了另一个具有相同名称SamplePayloadContent的生成的类,但该类不继承自AbstractSamplePayload。第二类来自已部署应用程序使用的依赖项。

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

© www.soinside.com 2019 - 2024. All rights reserved.