2016-11-29 43 views
0

我正在製作Maven項目並使用UDP偵聽器部署到Wildfly 10服務器,我的Facade已連接到我的數據庫(MariaDB)。 我有一個測試網頁,我發送一個字符串來完成這個過程,問題出現在我嘗試使用UDP監聽器進行同樣的過程時。使用實體管理器的Nullpointerexception

我的UDP服務器偵聽端口並獲取消息,但使用我在網頁中使用的相同過程將我的門面上的nullpointerexception帶給我,並且每當使用實體管理器時我都會發現它。

我的UDP服務器主類(這是我用來測試的類,但它發生的情況與部署的類相同)。

public class UDPServerRun { 

public static void main(String[] args) { 
    System.out.println("UDP Server"); 
    try { 
     DatagramSocket serverSocket = new DatagramSocket(8282); 
     byte[] receiveData = new byte[9]; 
     byte[] sendData = new byte[9]; 
     while (true) { 
      RegistrarEntrada entrada = new RegistrarEntrada(); 

      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
      serverSocket.receive(receivePacket); 
      String sentence = new String(receivePacket.getData()); 
      System.out.println("RECEIVED: " + sentence + "!"); 

      entrada.setCadenaEntrada(sentence); 
      String cadena = entrada.registrar(); 

      InetAddress IPAddress = receivePacket.getAddress(); 
      int port = receivePacket.getPort(); 
      sendData = cadena.getBytes(); 
      DatagramPacket sendPacket 
        = new DatagramPacket(sendData, sendData.length, IPAddress, port); 
      serverSocket.send(sendPacket); 
     } 
    } catch (Exception ex) { 
     Logger.getLogger(RegistrarEntrada.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    } 
} 

這是與Facade(也是測試類)連接的類。

public class RegistrarEntrada implements Serializable { 

private AsistenciasFacadeLocal facade = new AsistenciasFacade(); 

private String cadenaEntrada; 

public RegistrarEntrada() { 

} 

public String registrar() { 
    Calendar cal = Calendar.getInstance(); 
    int idPersonal = -1; 

    String entradas[] = cadenaEntrada.split(" "); 
    String idChecador = entradas[0]; 
    String idTarjeta = entradas[1]; 
    //String idChecador = "A1"; 
    //String idTarjeta = "F37C96"; 
    DateFormat timeFormat = new SimpleDateFormat("HH:mm"); 

    //try { 
    idPersonal = facade.consultarIdPersonal(idTarjeta); 
    //  } catch (Exception e) { 
    //   System.out.println(e); 
    //  } 

    if (idPersonal != -1) { 
     Personal persona = facade.consultarPersona(idPersonal); 

     if (persona != null) { 
      facade.registrarEntrada(idPersonal, idChecador); 
      return persona.getNombre() + " se registro a las: " + timeFormat.format(cal.getTime()); 
     } else { 
      return "Error 02"; 
     } 
    } else { 
     return "Error 01"; 
    } 

} 

//Getters and Setters 
public String getCadenaEntrada() { 
    return cadenaEntrada; 
} 

public void setCadenaEntrada(String cadenaEntrada) { 
    this.cadenaEntrada = cadenaEntrada; 
} 

public AsistenciasFacadeLocal getFacade() { 
    return facade; 
} 

public void setFacade(AsistenciasFacadeLocal facade) { 
    this.facade = facade; 
} 

} 

門面(我將標記我得到錯誤的線)。

@Stateless 
public class AsistenciasFacade implements AsistenciasFacadeLocal,  AsistenciasFacadeRemote { 

@PersistenceContext(unitName = "uvaqAsistenciasPU") 
private EntityManager em; 

protected EntityManager getEntityManager() { 
    return em; 
} 

public AsistenciasFacade() { 
    getEntityManager(); 
} 

@Override 
public void registrarEntrada(int idPersonal, String idChecador) { 
    Registros registro = new Registros(); 
    Calendar fecha = Calendar.getInstance(); 

    registro.setIdpersonal(idPersonal); 
    registro.setFechahoraregistro(fecha.getTime()); 
    registro.setIdchecador(idChecador); 
    em.persist(registro); 
} 

@Override 
public Personal consultarPersona(int idPersonal) { 
    String query = "SELECT * FROM personal WHERE IDPERSONAL=" + idPersonal; 
    List<Personal> objList = null; 
    objList = em.createNativeQuery(query, Personal.class).getResultList(); 
    if (objList.size() != 0) { 
     return objList.get(0); 
    } else { 
     return null; 
    } 
} 

@Override 
public int consultarIdPersonal(String idTarjeta) { 
    int idPersonal; 
    String query = "SELECT * FROM credenciales WHERE IDTARJETA = '" + idTarjeta + "'"; 
    List<Credenciales> objList = null; 
    objList = em.createNativeQuery(query, Credenciales.class).getResultList(); //<====== The error happens here and also in every place where I use the entity manager 
    if (objList.size() != 0) { 
     idPersonal = Integer.parseInt(objList.get(0).getIdpersonal()); 
     return idPersonal; 
    } else { 
     return -1; 
    } 

} 

@Override 
public void sincronizarPersonal(List<String[]> personal) { 
    System.out.println("Funcion Sincronizar Personal en Asistencias"); 
    List<Personal> nuevoPersonaltodos = new ArrayList<>(); 

    for (int i = 0; i < personal.size(); i++) { 
     Personal nuevoPersonal = new Personal(); 
     nuevoPersonal.setIdpersonal(Integer.parseInt(personal.get(i)[0])); 
     nuevoPersonal.setNombre(personal.get(i)[1]); 
     nuevoPersonal.setApellidopat(personal.get(i)[2]); 
     nuevoPersonal.setApellidomat(personal.get(i)[3]); 
     nuevoPersonal.setIdstatusper(Integer.parseInt(personal.get(i)[4])); 
     nuevoPersonaltodos.add(nuevoPersonal); 
    } 
    try { 
     em.persist(nuevoPersonaltodos); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 

} 
} 

我試圖解釋這個問題,我現在還沒有服務器日誌,但只要我能得到它,我將它寫在這裏。

編輯: 我的日誌說這個。

GRAVE: null 
java.lang.NullPointerException 
+0

歡迎來到Stack Overflow!請查看我們的[SO問題清單](http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist)來幫助你提出一個好問題,從而得到一個很好的答案。 –

+0

發佈異常堆棧跟蹤。 – lexicore

回答

0

在你RegistrarEntrada你實例化EJB,AsistenciasFacade。爲了注入EntityManager,EJB需要由容器管理。這意味着RegistrarEntrada的生命週期也需要由容器管理,並且您必須注入AsistenciasFacade EJB。

換句話說,你不能實例化一個對象並注入資源。容器需要處理這些類型對象的完整生命週期。

+0

問題是:我該如何解決它? –

+0

我不太清楚你到底在做什麼,所以很難說。但是如果你正在做'新的AsistenciasFacade()''EntityManger'將總是'null',因爲你管理的不是該容器的生命週期。 –

+0

好的,我只想知道如何使用RegistrarEntrada的EntityManager。 –