Duvida sobre classe CDI

1 resposta
jsfjava
Dayson_Rodrigues

estou aprendendo CDI e peguei um projeto,

essa classe faz o que?

public class CDIServiceLocator {

private static final Log LOGGER = LogFactory.getLog(CDIServiceLocator.class);

private CDIServiceLocator() {
}

private static BeanManager getBeanManager() {
    try {
        InitialContext initialContext = new InitialContext();
        return (BeanManager) initialContext.lookup("java:comp/BeanManager");
    } catch (NamingException e) {
        LOGGER.error(e);
        throw new RuntimeException("Não pôde encontrar BeanManager no JNDI.");
    }
}

@SuppressWarnings("unchecked")
public static <T> T getBean(Class<T> clazz) {
    BeanManager bm = getBeanManager();
    Set<Bean<?>> beans = (Set<Bean<?>>) bm.getBeans(clazz);

    if (beans == null || beans.isEmpty()) {
        return null;
    }

    Bean<T> bean = (Bean<T>) beans.iterator().next();
    CreationalContext<T> ctx = bm.createCreationalContext(bean);

    return (T) bm.getReference(bean, clazz, ctx);
}

}

1 Resposta

aix

Esta classe é um service locator, ela cria instâncias de serviços que não pertencem ao contexto da sua aplicação web, geralmente em JSF quando você utiliza aqueles converters e você tenta injetar um serviço um NullPointer irá surgir, isso porque os converters não são gerenciados pelo CDI, então você precisa fazer lookup deles.

Antigamente tinha um modo de cair fora desse problema(não sei se ainda é válido) mas era declarando seu converter como @Named.

A forma que eu acho mais elegante é utilizar o próprio CDI para isso, embora isso acabe dificultando nos testes unitários por ser static, ex:

@FacesConverter(value = "seuConverter")
public class SeuConverter implements Converter {

    SeuService servico;

    @Override
    public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
        this.servico = CDI.current().select(SeuConverter.class).get();
        return servico.algumMetodo();
    }

    @Override
    public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
        .............................
    }
}
Criado 2 de março de 2017
Ultima resposta 2 de mar. de 2017
Respostas 1
Participantes 2