2016-11-15 61 views
0

在我的JSF web應用程序中,在我的客戶機轉換器類中,即使使用@Inject annotatoin,我的指向服務類的變量也返回null(NPE)。@Inject returns null(NPE)

按照轉換器類代碼:

@FacesConverter(value = "clienteConverter") 
public class ClienteConverter implements Converter { 

    @Inject 
    private ClienteService clienteService; 

    @Override 
    public Object getAsObject(FacesContext fc, UIComponent uic, String string) { 
    if (string == null || string.length() == 0 || string.startsWith("-")) { 
     return null; 
    } 
    try { 
     Integer id = Integer.parseInt(string); 
     return clienteService.findById(id); // NPE here 
    } catch (NumberFormatException | ConverterException e) { 
     FacesUtils.error("Erro no converter: " + e.getMessage()); 
     throw new ConverterException("Erro de conversão do JSF - Valor " + string + " não conversível", e); 
    } 
    } 

我的依賴關係是:

<dependencies> 
    <!-- Usado para geração de PDFs --> 
    <dependency> 
     <groupId>com.lowagie</groupId> 
     <artifactId>itext</artifactId> 
     <version>2.1.7</version> 
    </dependency>  

    <!-- Usado para geração de arquivos Excel --> 
    <dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi</artifactId> 
     <version>3.8</version> 
     <scope>compile</scope> 
    </dependency>  

    <!-- PrimeFaces (biblioteca de componentes) --> 
    <dependency> 
     <groupId>org.primefaces</groupId> 
     <artifactId>primefaces</artifactId> 
     <version>5.3</version> 
     <scope>compile</scope> 
    </dependency> 

    <!-- PrimeFaces Themes --> 
    <dependency> 
     <groupId>org.primefaces.themes</groupId> 
     <artifactId>bootstrap</artifactId> 
     <version>1.0.10</version> 
     <scope>compile</scope> 
    </dependency> 

    <!-- Mojarra (implementacao do JSF) --> 
    <dependency> 
     <groupId>org.glassfish</groupId> 
     <artifactId>javax.faces</artifactId> 
     <version>2.2.9</version> 
     <scope>compile</scope> 
    </dependency> 

    <!-- Weld (implementação do CDI) --> 
    <dependency> 
     <groupId>org.jboss.weld.servlet</groupId> 
     <artifactId>weld-servlet</artifactId> 
     <version>2.3.2.Final</version> 
     <scope>compile</scope> 
    </dependency> 

    <!-- Implementacao do Bean Validation --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>5.2.3.Final</version> 
     <scope>compile</scope> 
    </dependency> 

    <!-- Núcleo do Hibernate -->    
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>5.1.0.Final</version> 
     <scope>compile</scope> 
    </dependency> 

    <!-- Implementação de EntityManager da JPA --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>5.1.0.Final</version> 
     <scope>compile</scope> 
    </dependency>  

    <!-- Driver JDBC do MySQL --> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.38</version> 
     <scope>compile</scope> 
    </dependency> 

    <!-- API de Servlet --> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
     <scope>provided</scope> 
    </dependency> 

    <!-- Commons Lang (utilidades) --> 
    <dependency> 
     <groupId>commons-lang</groupId> 
     <artifactId>commons-lang</artifactId> 
     <version>2.6</version> 
    </dependency>  
    </dependencies> 

ClienteService.java如下:

package br.com.inovasoftware.erp.web.atbimoveis.service; 

import br.com.inovasoftware.erp.web.atbimoveis.model.Cliente; 
import br.com.inovasoftware.erp.web.atbimoveis.repository.ClienteRepository; 
import br.com.inovasoftware.erp.web.atbimoveis.util.Transacional; 
import java.io.Serializable; 
import java.util.List; 
import javax.inject.Inject; 

/** 
* 
* @author Leonardo Rocha 
*/ 
public class ClienteService implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Inject 
    private ClienteRepository clienteRepository; 

    @Transacional 
    public void salvar(Cliente cliente) { 
    clienteRepository.gravar(cliente); 
    } 

    @Transacional 
    public void excluir(Cliente cliente) { 
    clienteRepository.remover(cliente); 
    } 

    public Cliente findById(Integer id) { 
    return clienteRepository.findById(id); 
    } 

    public List<Cliente> findByNomeOuCpf(String filtro) { 
    return clienteRepository.findByNomeOuCpf(filtro); 
    } 

    public List<Cliente> findAll() { 
    return clienteRepository.findAll(); 
    } 

}

+0

看看你的類,你沒有用[定義註釋的bean]註釋(http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#bean_defining_annotations)。所以問題是 - 你有'beans.xml'嗎?你的[bean dicovery模式]是什麼(http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#bean_archive)?這些課程是否像豆一樣被處理? – Siliarus

回答

1

標註您ClientServi與@Named CE,它會創建將被注入到轉換器一個bean:

@Named  
public class ClienteService implements Serializable 

退房this thread@Named更多信息。

+0

對不起,但沒有爲我工作。 – BicaBicudo

+0

@BicaBicudo:這個答案包含有效的信息。任何地方的錯誤? '不起作用'是很少的信息。從一個基本的教程開始,讓它工作! – Kukeltje