2012-07-14 6 views
0

У меня есть форма, в которой есть текстовое поле. Пользователь вводит адрес электронной почты в текстовое поле, а когда пользователь отправляет форму, класс Action находит uid пользователя из таблицы Users и отображает uid на странице JSP в виде сообщения с <s:actionmessage/>. Я получаю IndexOutOfBoundsException.java.lang.IndexOutOfBoundsException: Index: 0, Size: 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 класса:

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()); 
     } 
    } 
} 

, когда я удалить все стопорные блоки TRY я получаю исключение, как:

java.lang.ClassCastException: org.hibernate.impl.QueryImpl cannot be cast to java.util.List 

Я правильно сделал фасоль и картографирование таблиц с POJO. Может кто-нибудь указать на ошибку? Я использую Hibernate с Struts.

+1

Пожалуйста, разместите полную статистику стека об этом исключении. – Lion

+0

Извините, но infact. Я не получаю никаких ошибок стека на журналах сервера Glassfish. Однако единственное исключение наблюдается в браузере. – 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(); 
Смежные вопросы