2011-01-10 5 views
0

Aktualisierung der gesamten Post.Fehler: java.lang.ClassCastException

public Login authenticate(Login login) { 
     String query = "SELECT 1 FROM Login AS l WHERE l.email=? AND l.password=?"; 
     Object[] parameters = { login.getEmail(), login.getPassword() }; 
     List resultsList = getHibernateTemplate().find(query,parameters); 
     if (resultsList.size() == 1) { 
     results = (Login)resultsList.get(0); 
     System.out.println(results); 
     } else { 
      System.out.println("Error dude.... "); 
     // error no entity or mutiple entities 
     } 
     return results; 
} 

Ich gebe jetzt Login-Objekte zurück.

Wenn es keine übereinstimmende E-Mail gibt, bekomme ich dort keinen solchen Benutzer und auch diese Aussage wird ausgedruckt. System.out.println("Its Null Value" + newUser);

Aber wenn es eine E-Mail-und Passwort-Übereinstimmung gibt. Ich bekomme einen seltsamen Fehler.

Cause: java.lang.ClassCastException: java.lang.Integer cannot be cast to com.intermedix.domain.Login at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:507) at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:161) at com.vaadin.ui.AbstractComponent.fireEvent(AbstractComponent.java:1154) at com.vaadin.ui.Button.fireClick(Button.java:371) at com.vaadin.ui.Button.changeVariables(Button.java:193) at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariables(AbstractCommunicationManager.java:1094) at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.doHandleUidlRequest(AbstractCommunicationManager.java:590) at com.vaadin.terminal.gwt.server.CommunicationManager.handleUidlRequest(CommunicationManager.java:266) at com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:476) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to com.intermedix.domain.Login at com.intermedix.services.LoginService.authenticate(LoginService.java:31) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at $Proxy32.authenticate(Unknown Source) at com.intermedix.ui.LoginDailog.checkLogin(LoginDailog.java:106) at com.intermedix.ui.LoginDailog.access$0(LoginDailog.java:102) at com.intermedix.ui.LoginDailog$1.buttonClick(LoginDailog.java:52) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:487) ... 26 more

aktualisiert

Meine Login-Bean-Klasse

package com.intermedix.domain; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name="users") 
public class Login { 
     public Login(){} 
     private Long id = null; 
     private String email; 
     private String password; 

     public Login(String email, String password) 
     { 
      this.email = email; 
      this.password = password; 
     } 

     @Id 
     @GeneratedValue(strategy=GenerationType.AUTO) 
     public Long getId() { 
      return id; 
     } 

     public void setId(Long id) { 
      this.id = id; 
     } 

     public String getPassword() { 
      return password; 
     } 

     public void setPassword(String password) { 
      this.password = password; 
     } 

     public String getEmail() { 
      return email; 
     } 

     public void setEmail(String email) { 
      this.email = email; 

     } 
} 

und i entsprechend auch aktualisiert, um die Abfrage raplh.

+0

Sie versuchen, nur zwei Attribute und Casting ganz obj zu holen –

+0

kann mir nur auf das, was Licht aus – theJava

+0

zu bearbeiten Was bedeutet LoginService.authenticate Linie 32 aus? –

Antwort

2

Nach Ihrer Frage org.hibernate.hql.ast.QuerySyntaxException, gehe ich davon überzeugt, dass Anmeldung ein abgebildetes Objekt ist.

In diesem Fall brauchen Sie nicht die Zuordnung zwischen dem Abfrageergebnis und dem Objekt von Hand zu tun, wenn Sie den Ruhezustand in der richtigen Art und Weise verwenden:

korrigiert (ich habe die „AS l“ vergessen Teil der Abfrage)

List results = createQuery(
    "SELECT l FROM login AS l WHERE l.email=:email AND l.password=:password") 
    .setParameter("email",login.getEmail()) 
    .setParameter("password",login.getPassword()).list(); 
    if (results.isEmpty()) { 
    //.. login failed 
    } else if (result.size() > 1) { 
    throw new SomethingWrongException(); 
    } else { 
    Login login = (Login) results.get(0); 
    } 
+0

Natürlich können Sie die Abfrage von nicht Laden des Objekts optimze konnte, sondern nur noch die passenden entites zählen: 0 == Anmeldung fehlgeschlagen, 1 == pass> = 2 == sollten Sie eindeutige Einschränkungen verwenden – Ralph

+0

aktualisiert meinem Beitrag helfen mir – theJava

+0

@theJava - Das verstehe ich nicht? - Hat es jetzt funktioniert? - Sie brauchen: String query = "Von Login WHERE Email =? Und Passwort =?"; – Ralph

6

Wenn Sie ausführen eine Abfrage wie

SELECT email, id FROM Login WHERE email=? AND password=?

Sie Hibernate fordern Sie die spezifischen Eigenschaften email und id von der Login Einheit zu geben. Hibernate gibt Ihnen dann die Ergebnisse als eine Liste von Arrays, wobei jedes Listenelement das Array [email, id] darstellt.

Wenn Sie für alle Login Einheiten abfragen möchte nur die Ihren Kriterien entsprechen, dies dann tun:

FROM Login WHERE email=? AND password=?

Und dann werden Sie die Ergebnisliste Login Objekte enthalten.

Aber warum versuchen Sie zu LoginService zu werfen, habe ich keine Ahnung. Sie verwirren eine Reihe von verschiedenen Hibernate-Konzepten und versuchen, sie alle zusammen zu mischen.

Ich will nicht so wenig hilfreich klingen, aber ich denke, dass Sie wirklich die Hibernate-Dokumentation lesen und besser verstehen müssen, was Sie tun.

+0

meinen Beitrag aktualisiert ... danke ich werde die docs – theJava

1

versuchen diese zu ersetzen:

return (LoginService) results.get(0); 

mit diesem:

return (Login) results.get(0); 

Unter der Annahme, dass Login eine Hibernate-Einheit sollte es funktionieren ordnungsgemäß zugeordnet ist.

sollten Sie auch diese Zeile ändern

String query = "SELECT 1 FROM Login AS l WHERE l.email=? AND l.password=?"; 

zu

String query = "SELECT login FROM Login AS login WHERE login.email=? AND login.password=?"; 

Denken Sie auch daran, dass @ Ralph Vorschlag ist ein sehr gutes für, wie Abfragen parametrisieren. Du solltest es so machen.

+0

aktualisiert meine Post lesen mir helfen – theJava

1

Mit Ihrer aktualisierten Frage:

aktualisiert Anfrage:

String query = "SELECT l FROM Login AS l WHERE l.email=? AND l.password=?"; 

Und lesen Sie bitte das Handbuch: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

+0

Verursacht von: java.lang .ClassCastException: java.lang.Integer kann nicht in com.intermedix.domain.Login umgewandelt werden. Ich erhalte diesen Fehler nach der Aktualisierung von ur-code – theJava

+0

Bitte posten Sie den Complete-Stack-Trace und markieren Sie die Zeile, in der die Ausnahme auftritt. – Ralph

+0

Die Hauptpost wurde aktualisiert. – theJava

Verwandte Themen