【发布时间】:2020-08-07 07:31:42
【问题描述】:
我试图让杰克逊将代表集合的缺失属性反序列化为空集合而不是 NULL。我尝试了一些不同的东西,这是最新的不起作用。
如果有一种方法可以为所有 POJO 反序列化全局配置任何潜在的解决方案,那就太好了。
鉴于以下 json,缺少属性“资产”:
{
"name":"my-layer",
"code": "ly1",
"types":["type1", "type2"],
"private": false
}
给定以下 POJO:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSetter;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Builder.Default;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class CreateLayerRequest {
@NotBlank
@JsonProperty(required = true)
private String name;
@NotBlank
@JsonProperty(required = true)
private String code;
@Default
@NotNull
@JsonProperty(value = "private", required = true)
private Boolean privateLayer = Boolean.FALSE;
@Default
@JsonSetter(nulls = Nulls.AS_EMPTY)
@JsonProperty("types")
private Set<UUID> types = new HashSet<>();
@Default
@JsonSetter(nulls = Nulls.AS_EMPTY)
@JsonProperty("assets")
private Set<UUID> assets = new HashSet<>();
}
【问题讨论】:
-
这个答案应该会有所帮助:stackoverflow.com/a/51442640/112968
-
这不起作用。这就是我在示例中的内容。似乎
fasterxml.jackson.annotations没有添加到lombok生成的构造函数中。仅使用 javax 注释。 -
您是否看过答案中提到的“全局选项”?这样用来反序列化的
ObjectMapper实例配置正确了吗? -
我猜,您将
assets属性设置为null而不是空集合,对吗?您使用哪个版本的Jackson和Lombok?你能创建端到端的例子来让我们重现这个错误吗?如果JSON有效负载中没有键,则反序列化器不应覆盖默认值new HashSet<>()。如果要将属性设置为空集,最好使用Collections.emptySet()。 -
@knittl 我尝试在我的 spring 配置 bean 中配置对象映射器,但我不明白如何配置 spring 正在使用的对象映射器。