2017-02-14 3 views
2

Ich möchte nach Benutzernamen suchen, die nicht eindeutig ist. Ich implementierte unten Code in DAO und es gibt Fehler HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalStateException: EntityManager is closed.Spring EntityManager ist geschlossen

@PersistenceContext 
    private EntityManager entityManager; 

    @Transactional 
    public void save(Client client) { 
     entityManager.persist(client); 
    } 

public Client findByUsername(String username) { 
     Query query = entityManager.createNamedQuery("Client.CheckUsername"); 
      query.setParameter("username", username); 
    return (Client) query.getSingleResult(); 
} 

Abfrage: @NamedQuery(name="Client.CheckUsername", query="SELECT c.username FROM Client c WHERE c.username = :username")

Service:

@Autowired 
    ClientDAO clientDAO; 

    public Client findClientByUsername(String username){ 
     System.out.println("findclientbyusername: " + username); 
     return clientDAO.findByUsername(username); 
    } 

    public boolean isUsernameUnique(String username) { 
     Client client = findClientByUsername(username); 
     System.out.println("isusernameunique?: " + username); 
     System.out.println(client); 
     return (client == null || ((username != null) && client.getUsername() == username)); 

Wie kann ich dieses Problem beheben?

+0

Ich vermute, dass Sie diesen Fehler in Ihrem Controller haben, wenn Sie das Objekt vor der Rückgabe serialisieren. Können Sie im Debug-Modus einen Breakpoint direkt nach dieser Methodenausführung platzieren? –

+0

Wie und wo wird Ihre EntityManager-Instanz erstellt? – JonK

+0

Ich möchte den Dienst sehen, von dem diese Methode aufgerufen wird –

Antwort

3

Zuerst müssen Sie Ihre Abfrage ändern, da es eine Zeichenfolge, kein Objekt zurückgibt. findByUsername Funktion gibt Objekt zurück.

@NamedQuery(name="Client.CheckUsername", query="SELECT c FROM Client c WHERE c.username = :username") 

Service:

@Autowired 
ClientDAO clientDAO; 

public Client findClientByUsername(String username){ 
     return clientDAO.findByUsername(username); 
} 

public boolean isUsernameUnique(String username) { 
    Client client = findClientByUsername(username); 
    return (client == null || ((username != null) && client.getUsername() == username)); 

dao:

public Client findByUsername(String username) { 
     Query query = entityManager.createNamedQuery("Client.CheckUsername"); 
      query.setParameter("username", username); 
    return (Client) query.getSingleResult(); 
} 

Und ich empfehle Ihnen dringend DEBUG-Funktion anstelle von Druckvariablen die in den Funktionen zu nutzen.

Verwandte Themen