2016-01-25 74 views
0

我讀過的問題在這裏的計算器,如:春天一類不自動裝配場構造

我也看到了這些問題,提供的鏈接如3.9.3 Fine-tuning annotation-based autowiring with qualifiers但我沒有嘗試過。

這裏是我的類:

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中使用依賴注入到構造函數的參數中。

我該怎麼做才能注入田地?

+2

請勿自行構建實例類,彈簧只能將就在bean和它控制的實例中注入依賴關係。 –

+0

你能發表一個關於如何做的答案嗎? –

+0

這聽起來像你真正需要的是*工廠*注入了'templateLoader',它有一個方法,該方法需要'url'並返回服務對象。 – chrylis

回答

-1

創建一個彈簧控制豆最簡單的方法是直接通過所述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 { 
    ... 
1

使用REST API的使用Spring框架需要不同的處理。這裏是簡要的解釋。

Spring是一個框架,它維護組件bean的生命週期,並且完全負責從創建bean到銷燬它們。

REST API還負責維護它們創建的Web服務的生命週期。

因此,Spring和REST容器獨立工作以管理他們有效創建的組件。

在我最近的項目中,我通過創建一個實現Spring的ApplicationContextAware接口的單獨類來使用這兩種技術,並收集HashMap中的bean。可以從REST上下文靜態訪問此資源。

關於這個薄弱點是我們必須使用的beans.xml文件和註冊豆類在實現ApplicationContextAware界面按名稱獲取豆類等