Jackson Json 和 @JsonAnySetter 的不稳定行为
Unstable behavior with Jackson Json and @JsonAnySetter
我正在开发一个 Java 网络项目,使用 Jackson 进行 Json 序列化和反序列化。
我使用 Jetty 作为网络服务器
我正在尝试在构建时反序列化生成的 class:
/**
*Generated class at compile time
**/
@JsonInclude(NON_NULL)
public class SamplePayloadContent extends AbstractSamplePayload {
@NotNull
@JsonProperty(value = "sampleProperty", required = true)
private String sampleProperty;
...
}
我正在使用 AbstractSamplePayload
向生成的 class 添加属性,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));
}
}
因此,使用 @JsonAnySetter
和 handleUnknown
方法,我试图忽略其他属性。
之后,我尝试使用 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 as ignorable
尽管我们有@JsonAnySetter
.
通过添加一些包含 SamplePayloadContent class 方法列表的日志来深入研究问题后,我发现存在问题的 VM 无法识别扩展方法 handleUnknown
.
这里的奇怪行为是所有 VM 都具有相同版本的 Java 和 Jetty 以及相同的 OS,但我们与其中一些 的交互变得很糟糕.
在此先感谢您的帮助。
正如我所说,我们是 运行 许多不同 VM 上的应用程序,我们刚刚在其中一些中遇到了问题。
我们发现另一个生成的 class 具有相同的名称 SamplePayloadContent
并且在 class 路径中存在的同一个包中,但是这个 class 没有继承自 AbstractSamplePayload
.第二个 class 来自已部署应用程序使用的依赖项。
因此,在某些 VM 中,Jetty 考虑了错误的 class,因此我们得到了异常,而在其他 VM 中,Jetty 考虑了正确的 class,因此我们得到了预期的行为。
我正在开发一个 Java 网络项目,使用 Jackson 进行 Json 序列化和反序列化。 我使用 Jetty 作为网络服务器 我正在尝试在构建时反序列化生成的 class:
/**
*Generated class at compile time
**/
@JsonInclude(NON_NULL)
public class SamplePayloadContent extends AbstractSamplePayload {
@NotNull
@JsonProperty(value = "sampleProperty", required = true)
private String sampleProperty;
...
}
我正在使用 AbstractSamplePayload
向生成的 class 添加属性,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));
}
}
因此,使用 @JsonAnySetter
和 handleUnknown
方法,我试图忽略其他属性。
之后,我尝试使用 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 as ignorable
尽管我们有@JsonAnySetter
.
通过添加一些包含 SamplePayloadContent class 方法列表的日志来深入研究问题后,我发现存在问题的 VM 无法识别扩展方法 handleUnknown
.
这里的奇怪行为是所有 VM 都具有相同版本的 Java 和 Jetty 以及相同的 OS,但我们与其中一些 的交互变得很糟糕.
在此先感谢您的帮助。
正如我所说,我们是 运行 许多不同 VM 上的应用程序,我们刚刚在其中一些中遇到了问题。
我们发现另一个生成的 class 具有相同的名称 SamplePayloadContent
并且在 class 路径中存在的同一个包中,但是这个 class 没有继承自 AbstractSamplePayload
.第二个 class 来自已部署应用程序使用的依赖项。
因此,在某些 VM 中,Jetty 考虑了错误的 class,因此我们得到了异常,而在其他 VM 中,Jetty 考虑了正确的 class,因此我们得到了预期的行为。