【问题标题】:Adding a Spring context to a Jackson generated object将 Spring 上下文添加到 Jackson 生成的对象
【发布时间】:2015-06-02 19:34:36
【问题描述】:

我想尝试向数据对象添加业务逻辑。因此,我想让 Jackson 自动将 Spring 应用程序上下文注入每个生成的对象(从 JSON 生成)。

有没有办法告诉 Jackson 为每个生成的对象添加 Spring 上下文?

【问题讨论】:

  • 在对象的构造函数中这样做不是更容易吗?因此,一旦创建对象,就会确定并设置上下文,然后 Jackson 将调用适当的设置器来设置从 JSON 读取的值。

标签: java json spring jackson spring-boot


【解决方案1】:

使用@JacksonInject 注释指定值应该来自对象映射器/读取器的位置。

@Test
public void inject_global_context_object() throws Exception {
    ContextObject ctx = new ContextObject();
    mapper.setInjectableValues(new InjectableValues.Std()
                               .addValue(ContextObject.class, ctx));
    DataNeedingContext data = mapper.readValue("{\"prop\":\"foo\"}",
                                               DataNeedingContext.class);
    assertThat(data.ctx, sameInstance(ctx));
    assertThat(data.prop, equalTo("foo"));
}

@Test
public void inject_local_context_object() throws Exception {
    ContextObject ctx = new ContextObject();
    DataNeedingContext data = mapper.reader(DataNeedingContext.class)
            .with(new InjectableValues.Std()
                  .addValue(ContextObject.class, ctx))
            .readValue("{\"prop\":\"foo\"}");
    assertThat(data.ctx, sameInstance(ctx));
    assertThat(data.prop, equalTo("foo"));
}

public static class ContextObject {
}

public static class DataNeedingContext {
    private final ContextObject ctx;
    public String prop;

    public DataNeedingContext(@JacksonInject ContextObject ctx) {
        this.ctx = ctx;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2021-09-26
    • 2017-09-22
    相关资源
    最近更新 更多