gpt4 book ai didi

java - 我如何强制 Jackson 使用对象的 setter ?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:38:58 25 4
gpt4 key购买 nike

鉴于我有以下 JSON 文件:

{
"cleanup": false,
"clearCache": false
}

和以下 bean:

import org.apache.commons.lang3.Validate;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Config implements IHoldConfiguration {

public static final boolean DEFAULT_CLEANUP = false;
public static final boolean DEFAULT_CLEAR_CACHE = false;
public static final int DEFAULT_CONCURRENCY = 1;

@JsonProperty(value = "cleanup", required = false, defaultValue = "false")
private Boolean cleanup;

@JsonProperty(value = "clearCache", required = false, defaultValue = "false")
private Boolean clearCache;

@JsonProperty(value = "concurrency", required = false, defaultValue = "1")
private Integer concurrency;

public boolean isCleanup() {
return this.cleanup.booleanValue();
}

public void setCleanup(final Boolean cleanup) {
this.cleanup = cleanup != null ? cleanup : DEFAULT_CLEANUP;
}

public boolean isClearCache() {
return this.clearCache.booleanValue();
}

public void setClearCache(final Boolean clearCache) {
this.clearCache = clearCache != null ? clearCache : DEFAULT_CLEAR_CACHE;
}

public int getConcurrency() {
return this.concurrency.intValue();
}

public void setConcurrency(Integer concurrency) {

if (concurrency == null) {
concurrency = DEFAULT_CONCURRENCY;
} else {
Validate.inclusiveBetween(1, Integer.MAX_VALUE, concurrency,
String.format("concurrency must be in range [1, %s]", Integer.MAX_VALUE));
}

this.concurrency = concurrency;
}
}

如何强制 Jackson 2.9.2 使用我的 concurrency setter?当前,当使用 new ObjectMapper().readValue(inputStream, Config.class) 从 JSON 反序列化为 bean 时,concurrency 设置为 null .

我认为 Jackson 使用 bean 中的 setter(如果提供的话)来设置属性。在看到反序列化结果和调试后,我发现这不是真的。由于 JsonPropertydefaultValue 属性仅用于文档,我想我可以在 setter 中添加默认值设置,但显然这不起作用。我怎样才能做到这一点?

最佳答案

问题在于,由于并发性未在您的 json 字符串中声明,因此未调用 setter。如果你有

{
cleanup: false,
clearCache: false,
concurrency: null
}

然后将使用空参数调用 setter 并设置默认值。

要在不调整 json 字符串的情况下获得默认值,您可以做几件事。首先,您可以简单地在变量声明时设置默认值:

public class Config implements IHoldConfiguration {
...
public static final int DEFAULT_CONCURRENCY = 1;

...
private Integer concurrency = Integer.valueOf(DEFAULT_CONCURRENCY);

现在 Jackson 不尝试设置并发并不重要,因为它已经用正确的值构造。或者,您可以强制 Jackson 使用构造函数,它会传递所有值,即使是那些不在 json 字符串中的值。

例如,您可以添加一个构造函数,例如:

@JsonCreator
public Config (@JsonProperty("cleanup") Boolean cleanup,
@JsonProperty("clearCache") Boolean clearCache,
@JsonProperty("concurrency") Integer concurrency) {
....

然后把你的逻辑放在那里。

关于java - 我如何强制 Jackson 使用对象的 setter ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47895462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com