我已经在stackoverflow中阅读了这里的问题,例如:
我还阅读了这些问题中提供的链接,例如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中使用依赖注入到构造函数的参数。
我应该怎样做以注入野外?
答案 0 :(得分:1)
在Spring框架中使用Rest API需要以不同方式处理。这是简短的解释。
Spring是一个维护组件bean生命周期的框架,完全负责从bean创建到销毁。
REST API还负责维护他们创建的Web服务的生命周期。
因此,Spring和REST容器正在独立工作以管理他们有效创建的组件。
在我最近的项目中,通过创建一个实现Spring ApplicationContextAware
接口的单独类,并在HashMap
中收集bean,我使用了两种技术。可以从REST上下文静态访问此资源。
关于这一点的弱点是我们必须使用beans.xml文件并注册bean,并在实现ApplicationContextAware
接口的类中按名称获取bean等。
答案 1 :(得分:-1)
创建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 {
...