簡體   English   中英

Spring沒有使用構造函數自動裝配類中的字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM