我正在尝试结合杰克逊和龙目岛.这些是我的课程:
package testelombok;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Value;
import lombok.experimental.Wither;
@Value
@Wither
@AllArgsConstructor(onConstructor=@__(@JsonCreator))
public class TestFoo {
@JsonProperty("xoom")
private String x;
private int z;
}
Run Code Online (Sandbox Code Playgroud)
package testelombok;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xebia.jacksonlombok.JacksonLombokAnnotationIntrospector;
import java.io.IOException;
public class TestLombok {
public static void main(String[] args) throws IOException {
TestFoo tf = new TestFoo("a", 5);
System.out.println(tf.withX("b"));
ObjectMapper om = new ObjectMapper().setAnnotationIntrospector(new JacksonLombokAnnotationIntrospector());
System.out.println(om.writeValueAsString(tf));
TestFoo tf2 = om.readValue(om.writeValueAsString(tf), TestFoo.class);
System.out.println(tf2);
}
}
Run Code Online (Sandbox Code Playgroud)
这些是我在classpth中添加的JAR:
龙目岛:https://projectlombok.org/downloads/lombok.jar(版本1.16.10)
杰克逊核心:http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.8.2/jackson-core-2.8.2.jar …
我非常好奇Jackson如何创建对象,包括它的私有属性/字段,没有setter,只使用对象空构造函数.
我问的原因是当我反序列化某些属性时,我想根据这些值自动设置其他属性.例如,我不想序列化图像,只是它的路径.一旦路径被反序列化,@JsonIgnore字段Image就可以加载实际图像.在反序列化对象的构造之后,尚未分配字段.从逻辑上讲,吸气剂没有被调用.那么伏都教魔法是什么触摸我的物体私处?
public class ItemTemplate {
private String imagePath;
public ItemTemplate() {
System.out.println(imagePath); //Still null
}
public String getImagePath() {
System.out.println(imagePath); //Not being called when deserializing.
return imagePath;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当杰克逊完成对这个对象的反序列化时,它已经imagePath设置好了.