对象映射器反序列化后的@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
字段,如 storePersistency
和 sroreSize
(这是 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
将被更新。
我正在使用 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
字段,如 storePersistency
和 sroreSize
(这是 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
将被更新。