Ism*_*ail 6 java jackson jetty-9
我正在使用 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;
...
}
Run Code Online (Sandbox Code Playgroud)
我正在使用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));
}
}
Run Code Online (Sandbox Code Playgroud)
因此,使用@JsonAnySetterandhandleUnknown方法,我试图忽略其他属性。
之后,我尝试使用 ObjectMapper 反序列化 Json 格式字符串:
public SamplePayloadContent buildContent(String jsonPayload) throws IOException{
ObjectMapper objectMapper=new ObjectMapper();
return objectMapper.readValue(jsonPayload, SamplePayloadContent.class);
}
Run Code Online (Sandbox Code Playgroud)
构建项目后,反序列化在运行时一切正常,其他属性被正确忽略。
在不同的虚拟机中部署 Web 存档后,其中一些,当尝试使用前面的方法构建我们的对象时,UnrecognizedPropertyException: Unrecognized field "sampleProperty" , not marked as ignorable尽管我们有@JsonAnySetter.
通过添加一些包含 SamplePayloadContent 类的方法列表的日志来挖掘问题后,我发现存在问题的 VM 无法识别扩展方法handleUnknown。
这里奇怪的行为是所有 VM 都具有相同版本的 Java 和 Jetty 以及相同的操作系统,但是我们与其中一些的交互变得很糟糕。
在此先感谢您的帮助。
正如我所说,我们在许多不同的虚拟机上运行该应用程序,并且我们刚刚在其中一些虚拟机中遇到了问题。我们发现另一个生成的类具有相同的名称SamplePayloadContent,并且位于类路径中存在的同一包中,但该类不继承自AbstractSamplePayload. 第二个类来自已部署应用程序使用的依赖项。
因此,在某些 VM 中,Jetty 考虑了错误的类,因此我们得到了异常,而在其他 VM 中,Jetty 考虑了正确的类,因此我们得到了预期的行为。
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |