2012-07-14 1 views
0

텍스트 필드가있는 양식이 있습니다. 사용자는 텍스트 필드에 전자 메일 주소를 입력하고 사용자가 양식을 제출하면 Action 클래스는 Users 테이블에서 uid 사용자를 찾고 uid<s:actionmessage/>이라는 메시지로 JSP 페이지에 표시합니다. IndexOutOfBoundsException이 나옵니다.java.lang.IndexOutOfBoundsException : 인덱스 : 0, 크기 : 0

내 JSP 양식은 다음과 같습니다

<s:form action="okadddqs" method="post" cssClass="text"> 

    <s:textfield label="Your Email address " name="email"/> 
    <s:submit value="Find Uid"/> 
</s:form> 

Action 클래스의 코드는 다음과 같습니다

java.lang.ClassCastException: org.hibernate.impl.QueryImpl cannot be cast to java.util.List 
: 내가 모든 시도의 catch 블록을 제거 할 때

package com.rambo.action; 

import beans.Users; 
import com.opensymphony.xwork2.ActionSupport; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.StringTokenizer; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import org.hibernate.Session; 

/** 
* 
* @author ROMO 
*/ 
@ManagedBean 
@SessionScoped 
public class NewQuestion extends ActionSupport { 

    private String email; 

    private List<Users> ul = new ArrayList<Users>(); 

    public List<Users> getUl() { 
     return ul; 
    } 

    public void setUl(List<Users> ul) { 
     this.ul = ul; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 
/* i have used many where the getUid() and getEmail() even in the error and messages to find what the value it is getting on error. */ 
    @Override 
    public String execute() throws Exception { 
     Session session = null; 
     int d; 
     try { 
      session = HibernateUtil.getSessionFactory().getCurrentSession(); 
      session.beginTransaction(); 
      try { 
       ul = (List<Users>) session.createQuery("from Users c where c.email = '" + getEmail() + "'"); 
       if (!ul.isEmpty()) { 
        d = ul.get(0).getUid(); 
       } else { 
        this.addActionError("Oops. Sorry. You are Not Allowed now. Please Try Again Later." + getEmail() + ","+ ul.get(0).getUid()); 
        session.close(); 
        return ERROR; 
       } 
      } catch (Exception e) { 
       this.addActionError("Oops. There was an error." + getEmail() + ","+ ul.get(0).getUid()); 
       session.close(); 
       return ERROR; 
      } 
      session.getTransaction().commit(); 
     } catch (Exception e) { 
      this.addActionError("Oops. An Error Encountered...! Email address " + getEmail() + ","+ ul.get(0).getUid()+" not registered. Try with your new email address."); 
      session.close(); 
      return ERROR; 
     } 
     this.addActionMessage("Your Uid is : " + ul.get(0).getUid()); 
     return SUCCESS; 
    } 

    @Override 
    public void validate() { 
     if ("".equals(getEmail()) || getEmail() == null) { 
      this.addActionError("Email is Compulsory to input..!" + getCname()); 
     } else if (getEmail().indexOf("@") < 0 || getEmail().indexOf(",") > 0 || getEmail().indexOf(".") < 0 || lastEmailFieldTwoCharsOrMore(getEmail()) == false) { 
      this.addActionError("Please Input a valid email address." + getCname()); 
     } 
    } 
} 

내가 같은 예외가

POJO를 사용하여 테이블의 빈과 매핑을 올바르게 수행했습니다. 누군가가 오류를 지적 할 수 있습니까? 나는 Struts와 함께 Hibernate를 사용하고있다.

+1

해당 예외에 대한 전체 스택 추적을 게시하십시오. – Lion

+0

죄송하지만 실제로 glassfish 서버 로그에 stacktrace 오류가 표시되지 않습니다. 그러나 유일한 예외는 브라우저에서 볼 수 있습니다. – codeofnode

+0

'try ... catch'를 사용하여 예외를 잡기 때문입니다. 일시적으로이'try ... catch'를 주석 처리하면 스택 추적을 얻을 수 있습니다. 사용자가 스택 추적을보고 난 후에 만 ​​예외의 정확한 원인을 더 정확하게 추측 할 수 있기 때문입니다. – Lion

답변

2

코드의 다음 줄이 잘못되었습니다 : 다시

ul = (List<Users>) session.createQuery(
    "from Users c where c.email = '" + getEmail() + "'" 
); 

createQuery 반환하는 쿼리 객체입니다. 해당 쿼리의 결과를 보려면 Query.list()을 사용하십시오.

ul = (List<Users>) session.createQuery(
    "from Users c where c.email = '" + getEmail() + "'" 
).list();