【问题标题】:@autowire beans and @value properties after object mapper deserialized json对象映射器反序列化 json 后的 @autowire bean 和 @value 属性
【发布时间】:2020-01-01 12:27:08
【问题描述】:

我正在使用spring框架。

我正在使用 objectMapper 来获取 store.json 文件:

服务:

objectMapper.readValue(new File(jsonFilePath), Store.class)

store.json:

{
  "type": "Store",
  "name": "myStore",
}

Store.class:

@Value("${store.size:1000}")
private Integer sroreSize;

@autowire
private storePersistency storePersistency;

public Store(@JsonProperty("name") String name) {
    super(name);
}

我正在尝试找出如何在 store.class 中使用 @autowire beans 和 @value 属性,以及 applicationContext 中存在的 beans 和属性。 在当前示例中,sroreSize 和 storePersistency 仍然为空。

我知道我可以将字段注入对象映射器,然后使用 @JacksonInject 注释,但我有很多字段要注入 - 对我来说不是一个好选择。 自定义解串器对我来说也不是一个好的选择。

有没有办法不使用自定义反序列化器或不注入 store.class 中我需要的每个 bean/属性? 注入所有 bean 和属性的东西,我可以在 Store.class 中使用它。

【问题讨论】:

    标签: spring jackson autowired objectmapper


    【解决方案1】:

    因此,您希望一些 Store 字段,例如 storePersistencysroreSize 在应用程序启动时初始化一次(即 Spring 将设置应用程序上下文的时间),然后在运行时创建多个不同的 Store 对象一些字段为name,由 Jackson 初始化。

    我建议用 @Component 注释 Store 以让 Spring 初始化 @Value@Autowired 字段。 @Scope 注释将导致每次创建一个新的独立 Store 实例。简化示例:

    @Component
    @Scope(SCOPE_PROTOTYPE)
    class Store {
    
        private String name;
    
        @Value("${store.size:1000}")
        private Integer sroreSize;
    }
    

    然后关键是方法readerForUpdating,您可以在其中传递Store 的现有实例,Jackson 将更新它,而不是像往常一样创建一个新实例:

        Store store = context.getBean(Store.class);
        objectMapper.readerForUpdating(store).readValue("{\"name\":\"myStore\"}");
    

    context 是我在测试类中自动装配的 Spring ApplicationContext 引用。在这种情况下,您不需要使用readValue 的返回值,只需检查现有的store 变量,name 将被更新。

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      相关资源
      最近更新 更多