【发布时间】:2016-05-02 05:41:27
【问题描述】:
我在 stackoverflow 中读过一些问题,例如:
- Anyway to @Autowire a bean that requires constructor arguments?
- How to @Autowire bean with constructor
我还阅读了这些问题中提供的链接,例如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 中的构造函数参数使用依赖注入。
我应该怎么做才能注入字段?
【问题讨论】:
-
不要自己构造实例,spring只会在bean和它控制的实例中注入依赖。
-
你能发布一个关于如何做的答案吗?
-
听起来你真正需要的是一个注入了
templateLoader的工厂,它有一个采用url并返回服务对象的方法。
标签: java spring spring-mvc dependency-injection