[英]Spring not autowiring field in a class with constructor
我在這里閱讀了stackoverflow中的問題,例如:
我還閱讀了這些問題中提供的鏈接,例如3.9.3使用限定符對基於注釋的自動裝配進行微調,但沒有任何嘗試。
這是我的課:
public class UmbrellaRestClient implements UmbrellaClient {
private static final Logger LOGGER = LoggerFactory.getLogger(UmbrellaRestClient.class);
private static final Map<String, String> PARAMETROS_INFRA_UMBRELLA = ApplicationContextProvider.getApplicationContext().getBean(ParametrosInfraComponent.class)
.findByIdParametroLikeAsMap("%UMBRELLA%");
private final HttpConnectionRest conexaoHttp;
@Autowired
@Qualifier
private TemplateLoaderImpl templateLoader;
public UmbrellaRestClient(final String url) {
this.conexaoHttp = new HttpConnectionRest(UmbrellaRestClient.PARAMETROS_INFRA_UMBRELLA.get("UMBRELLA_HOST") + url, "POST", true);
}
/**
* {@inheritDoc}
*/
@Override
public String enviarNfe(final String cnpjFilial, final String idPedido, final BigDecimal valorGNRE, final String arquivoNfe) {
if (StringUtils.isBlank(arquivoNfe)) {
throw new ClientException("Arquivo de NF-e não carregado.");
}
final String usuario = StringUtils.defaultIfBlank(UmbrellaRestClient.PARAMETROS_INFRA_UMBRELLA.get("USUARIO_UMBRELLA"), "WS.INTEGRADOR");
Map<String, String> parametrosTemplate = new HashMap<>(6);
parametrosTemplate.put("usuario", usuario);
parametrosTemplate.put("senha", StringUtils.defaultIfBlank(UmbrellaRestClient.PARAMETROS_INFRA_UMBRELLA.get("SENHA_UMBRELLA"), "WS.INTEGRADOR"));
parametrosTemplate.put("valorGNRE", valorGNRE.toPlainString());
parametrosTemplate.put("idPedido", idPedido);
parametrosTemplate.put("cnpjFilial", cnpjFilial);
parametrosTemplate.put("arquivoNfe", arquivoNfe);
final String xmlRequisicao = ConverterUtils.retornarXMLNormalizado(this.templateLoader.preencherTemplate(TemplateType.ENVIO_XML_NFE, parametrosTemplate));
this.conexaoHttp.setXmlEnvio(xmlRequisicao);
UmbrellaRestClient.LOGGER.info("XML ENVIO #####################: {}", xmlRequisicao);
return this.conexaoHttp.enviarXML();
}
}
字段templateLoader不會被注入。 我在其他具有依賴項注入並且可以正常工作的類中進行了測試。 我猜發生了這種情況,因為我有一個依賴於參數的構造函數,並且每個需要使用它的類實際上都傳遞了該參數,因此,例如,我不能在applicationContext中對構造函數的參數使用依賴項注入。
我該怎么做才能注入電場?
將Rest API與Spring框架一起使用需要進行不同的處理。 這里是簡要說明。
Spring是一個框架,用於維護組件bean的生命周期,並從創建bean到銷毀bean負全責。
REST API還負責維護其創建的Web服務的生命周期。
因此,Spring和REST容器正在獨立工作,以管理它們有效創建的組件。
在我最近的項目中,我通過創建一個單獨的類來實現這兩種技術,該類實現了Spring的ApplicationContextAware
接口,並將這些bean收集在HashMap
。 可以從REST上下文靜態訪問此資源。
弱點是我們必須使用beans.xml文件並注冊bean,並在實現ApplicationContextAware
接口的類中按名稱等獲取bean。
創建Spring受控bean的最簡單方法是直接通過ApplicationContext
:
@Autowired
private ApplicationContext context;
private UmbrellaRestClient getNewUmbrellaRestClient(String url) {
return context.getBean("umbrellaRestClient", new Object[]{url});
}
基本上,這是工廠方法。 為此,必須將UmbrellaRestClient聲明為作用域prototype
的bean。 因為所有具有非默認構造函數的bean都必須是作用域原型。
如果該類在經過組件掃描的包中,則可以滿足:
@Service
@Scope("prototype")
public class UmbrellaRestClient implements UmbrellaClient {
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.