Spring不是带有构造函数的类中的自动装配字段

时间:2016-01-25 19:24:08

标签: java spring spring-mvc dependency-injection

我已经在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中使用依赖注入到构造函数的参数。

我应该怎样做以注入野外?

2 个答案:

答案 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 {
    ...