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