首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何强制Jackson使用对象的Setter?

如何强制Jackson使用对象的Setter?
EN

Stack Overflow用户
提问于 2017-12-20 05:28:53
回答 2查看 3.1K关注 0票数 5

假设我有以下JSON文件:

代码语言:javascript
复制
{
    "cleanup": false,
    "clearCache": false
}

和下面的bean:

代码语言:javascript
复制
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;
    }
}

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-20 06:08:01

问题是,由于并发性没有在json字符串中声明,所以setter没有被调用。如果你有

代码语言:javascript
复制
{
    cleanup: false,
    clearCache: false,
    concurrency: null
}

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

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

代码语言:javascript
复制
public class Config implements IHoldConfiguration {
    ...
    public static final int DEFAULT_CONCURRENCY = 1;

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

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

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

代码语言:javascript
复制
@JsonCreator
public Config (@JsonProperty("cleanup") Boolean cleanup,
               @JsonProperty("clearCache") Boolean clearCache,
               @JsonProperty("concurrency") Integer concurrency) {
    ....

然后把你的逻辑放进去。

票数 5
EN

Stack Overflow用户

发布于 2017-12-20 06:03:41

您不能强制调用它,因为没有任何东西可以用来调用它。

设置默认值的通常方法是直接在声明中为字段赋值,如下所示:

代码语言:javascript
复制
private Integer concurrency = Integer.valueOf(1);

或者在默认构造函数中执行此操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47895462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档