JSF Converter + Spring [Resolvido]

Pessoal,

Estou com a seguinte situação:

Preciso listar em um Combobox objetos de domínio, para tal eu criei um converter (abaixo).

Não posso dar um “new XptoUseCase()” pois ele é um bean gerenciado do Spring.

1 - Se eu coloco só o construtor com parâmetro recebo erro dizendo que não foi possível instanciar XptoConverter;

2 - Da forma que está, o ‘useCase’ está null no método “getAsObject” pois não foi injetado;

Alguém saberia me dizer como faço para resolver tal situação?

@Service(value="xtpoConverter")
public class XptoConverter implements Converter { 

	private XptoUseCase useCase;
	
	public XptoConverter () {
		System.out.println("instanciou");
	}
	
	@Autowired(required = true)
	public XptoConverter (XptoUseCase useCase) {
		this.useCase = useCase;
	}
	
	public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException { 
	    if (value == null) { 
	      return null; 
	    }    
	    return useCase.executeFilter(value, 0, 1);
	  } 
	 
	public String getAsString(FacesContext context, UIComponent component, Object object) throws ConverterException { 
	    if (object == null) { 
	      return null; 
	    } 
	    Xpto entity = (Xpto) object; 
	    return entity.getNome(); 
	  } 	 
} 

Não tenho certeza do que vou dizer, pois não mexo com isso faz um tempo, mas…

Para que o Spring controle o bean, ele deve ser criado pelo container do Spring e não pelo JSF. Isso quer dizer que você deve fazer:

<h:inputText ... converter="#{xptoConverter}" /> //ou o componente que você for usar

e não:

<h:inputText ... > //ou o componente que você for usar <f:converter converterId="xptoConverter" /> </h:inputText>

A diferença é que no primeiro, o JSF utilizará o ELResolver do Spring (se você mapeou corretamente no faces-config para utiliza-lo) e por isso ele será capaz de injetar as dependencias. No outro caso, é o JSF que criará a instância do Converter (você o mapeia no faces-config) e não conseguirá injetar as dependências que o Spring gerencia.

Valeu Guilherme,

Era isso mesmo.