对象映射器反序列化后的@autowire bean 和@value 属性json

@autowire beans and @value properties after object mapper deserialized json

我正在使用 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);
}

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

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

有什么方法可以不使用自定义反序列化器或不注入我在 store.class 中需要的每个 bean/property? 注入所有 bean 和属性的东西,我可以简单地在 Store.class.

中使用它

所以您希望在应用程序启动时初始化一些 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 是我在测试 class 中自动装配的 Spring ApplicationContext 引用。在这种情况下,您不需要使用 readValue 的 return 值,只需检查现有的 store 变量,name 将被更新。