我有一個公開JSON REST API的spring-boot應用程序。爲了將對象映射到json,它使用由spring-boot配置的內置jackson ObjectMapper。如何聲明另一個Jackson ObjectMapper而不影響原始bean的'客戶端'?
現在我需要從yaml文件中讀取一些數據,並且我發現使用Jackson的一個簡單方法是使用Jackson - 爲此我需要聲明一個不同的ObjectMapper將yaml轉換爲對象。我宣佈這個新的映射豆具有特定名稱能在我的業務處理從YAML文件中讀取到其注射:
@Bean(YAML_OBJECT_MAPPER_BEAN_ID)
public ObjectMapper yamlObjectMapper() {
return new ObjectMapper(new YAMLFactory());
}
但我需要一種方法來告訴所有的原始的其他「客戶」 json ObjectMapper繼續使用這個bean。所以基本上我需要在原始bean上使用@Primary註解。有沒有一種方法可以實現這一點,而無需在我自己的配置中重新聲明原始的ObjectMapper(我必須通過spring-boot代碼來查找並複製其配置)?
我發現的一個解決方案是爲ObjectMapper聲明一個FactoryBean,並使其返回已聲明的bean,如this answer中所建議的。我發現,我的原豆被稱爲「_halObjectMapper」調試,所以我的FactoryBean將搜索這個bean並返回:
public class ObjectMapperFactory implements FactoryBean<ObjectMapper> {
ListableBeanFactory beanFactory;
public ObjectMapper getObject() {
return beanFactory.getBean("_halObjectMapper", ObjectMapper.class);
}
...
}
然後在我的配置I類聲明爲@Primary豆,以確保它的用於自動裝配的首選:
@Primary
@Bean
public ObjectMapperFactory objectMapperFactory(ListableBeanFactory beanFactory) {
return new ObjectMapperFactory(beanFactory);
}
不過,我不是很滿意這個解決方案100%,因爲它依賴於它是不是我的控制下的bean的名字,也似乎是一個黑客。有更清潔的解決方案嗎?
謝謝!
我也嘗試使用'YAMLMapper'(它擴展了'ObjectMapper')作爲我的自定義bean類型,但spring仍然會抱怨它找到了兩個'ObjectMapper'類型的bean。我沒有想到這一點,儘管在某種程度上它是合理的。所以今天我又學到了一些新東西。這意味着如果我自動編寫一個類型爲「List
檢查我的答案更新。 –