[JSF][SPRING] Alterando o ciclo de vida

Boa tarde senhores.
Estou com uma dúvida que ainda não consegui resolver.

Preciso que o JSF não chame o construtor vazio de uma classe pois o construtor que deve ser chamado no inicio do ciclo de vida é gerenciado pelo spring utilizando autowired=constructor.

O spring inicializa o objeto corretamente, porém o JSF vem depois e chama o padrão e isso apaga os itens que foram coletados antes pois é um managed-bean com escopo request.
Seguem as classes p uma idéia melhor.

package br.com.ibid.view;

import br.com.ibid.dto.CustomerDTO;
import br.com.ibid.service.CustomerService;
import java.util.List;

/**
 *
 * @author lgertel
 *
 */

public class ListCustomers {

    private CustomerService customerService;
    private List<CustomerDTO> customers;

    public ListCustomers() {
        System.out.println("DEFAULT");
        System.out.println(this.customers);
    }

    public ListCustomers(CustomerService customerService) {
        this.customerService = customerService;
        this.customers = this.customerService.findAll();
        
        System.out.println("NON DEFAULT");
        System.out.println(this.customers);
    }

    public List<CustomerDTO> getCustomers() {
//        this.customers = this.customerService.findAll();
        return customers;
    }

    public void setCustomers(List<CustomerDTO> customers) {
        this.customers = customers;
    }

    public CustomerService getCustomerService() {
        return customerService;
    }

    public void setCustomerService(CustomerService customerService) {
        this.customerService = customerService;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <bean id="customerService" class="br.com.ibid.service.CustomerServiceImpl" autowire="constructor"/>  
    <bean id="listCustomers" class="br.com.ibid.view.ListCustomers" autowire="constructor" />
    
</beans>
<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="1.2" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">

    <managed-bean>
        <managed-bean-name>listCustomer</managed-bean-name>
        <managed-bean-class>br.com.ibid.view.ListCustomers</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
        <managed-property>
            <property-name>customerService</property-name>
            <value>#{customerService}</value>
        </managed-property>
    </managed-bean>
    
    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
</faces-config>

Agradeço de antemão.
Abraços,

Porque você declara listCustomer tanto no xml do faces, quanto no Spring? Não seria melhor apenas declarar o bean no xml do Spring?

Na verdade, o programa está chamando o bean com construtor vazio porque está usando o bean gerenciado pelo Faces, não pelo Spring! Apaga o bean do Faces, pronto!

E detalhe, declare o escopo do “spring bean” corretamente, porque, por default, é Singleton. E acredito que este escopo não é o mais adequado para o seu caso.

É isso.

Este bean deve ser gerenciado pelo faces… ele vai ser renderizado e vai ter vários actions ligados a ele.
Não entendi como isso poderia ser gerenciado somente pelo spring e não pelo faces.

Como faria isso?
Abraços

Resolvi…

O erro é que no spring listCustomers tava no plural…rs.
Valeu!

[quote=Lucas Lacerda Gertel]Este bean deve ser gerenciado pelo faces… ele vai ser renderizado e vai ter vários actions ligados a ele.
Não entendi como isso poderia ser gerenciado somente pelo spring e não pelo faces.

Como faria isso?
Abraços[/quote]

O que significa esse trecho de código no seu faces-config.xml?

    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>

Significa que quando o faces precisar descobrir o objeto de uma expression language, vai buscar primeiro nos beans do Spring, depois no Faces (se houver). É essa classe “Resolver” que faz com que os beans sejam gerenciados somente pelo Spring.

E outra coisa, se você trocou de “listCustomers” para “listCustomer” no xml do Spring, significa que nunca, NUNCA!, será utilizado o managed bean gerenciado pelo Faces, pois sempre será encontrado PRIMEIRO o bean gerenciado pelo Spring. Ou seja, apague a declaração “listCustomer” no Faces, que você simplesmente não sentirá a diferença.

autowire=“constructor” é a unica maneira de obter o contexto do spring no construtor de um back bean ?