我正在尝试实现简单的登录系统。我有一个带有表单的JSP,用户输入用户名和密码,然后是读取这些参数的servlet。您将从servlet代码中理解:
User user = userDao.findUserWithUsernameAndPassword(username, password);
// user found
if (user!=null) {
session = request.getSession(true);
session.setAttribute("user", user);
loginMessage = "Welcome";
request.setAttribute("loginMessage", loginMessage);
RequestDispatcher dispatcher = request.getRequestDispatcher("login.jsp");
dispatcher.forward(request, response);
} else // username and password not matching
{
loginMessage = "Wrong username or password! Please try again.";
request.setAttribute("loginMessage", loginMessage);
RequestDispatcher dispatcher = request.getRequestDispatcher("login.jsp");
dispatcher.forward(request, response);
}
如果我输入有效的用户名和密码,这是有效的,但如果不是,我将获得下一个例外:
javax.persistence.NoResultException: Query "SELECT u FROM User u WHERE
u.username like :username AND u.password LIKE :password" selected no
result, but expected unique result.
处理这种情况的正确方法是什么?我想错误的用户名和密码参数来显示相应的消息(转发'loginMessage'变量)。
[已添加]这是UserDAOBean中的代码:
@Stateless
@Local(UserDAOLocal.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class UserDAOBean extends GenericDAOBean<User, Integer> implements UserDAOLocal{
public User findUserWithUsernameAndPassword(String username, String password)
{
Query q = em.createNamedQuery("findUserWithUsernameAndPassword");
q.setParameter("username", username);
q.setParameter("password", password);
User result = (User) q.getSingleResult();
return result;
}
}
实体User中的命名查询是:
@NamedQuery(name =“findUserWithUsernameAndPassword”,query =“SELECT u FROM User u WHERE u.username like:username AND u.password LIKE :密码“)
答案 0 :(得分:2)
当您调用getSingleResult方法并且没有结果时,实例管理器将抛出此异常,因此您需要更改findUserWithUsernameAndPassword方法。 如果您通过它的主键搜索实体,则可以使用em.find,如果没有结果,则该方法返回null。 另一个选项是不使用getSingleResult()并使用getResultList()如果没有结果,它将不会抛出NoResultException,如果没有结果,你需要检查列表是否为空。
如果要维护方法,必须捕获异常并实现没有结果的逻辑。