java - 如何修复 'org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0'错误

标签 java spring

我收到一个错误

org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
    at org.springframework.dao.support.DataAccessUtils.nullableSingleResult(DataAccessUtils.java:97)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:236)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:244)
    at com.regularbbs.bbs.dao.UserDao.findUserByIdAndPw(UserDao.java:38)
    at com.regularbbs.bbs.service.impl.UserServiceImpl.login(UserServiceImpl.java:20)

我认为它没有将我的参数传递给 MySQL 数据库。当我测试时,我发现我的参数被传递到DAO文件中。但它正好陷入困境。当我在DAO文件中的findUserByIdAndPw方法中打印 map 时,它很好地打印了 map 中的参数。

我认为 jdbc.queryForObject(GET_USER, map, rowMapper); 是错误的,但我不知道,请帮助我。

package com.regularbbs.bbs.dao;

public class UserSqls {
    public static final String GET_USER = "SELECT * from user WHERE userId=':userId' AND password=':password'";
}
'''

Jsp 文件:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="<c:url value='/css/main.css' />" >
<script
  src="https://code.jquery.com/jquery-3.4.1.js"
  integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="
  crossorigin="anonymous"></script>
</head>
<body>
    <jsp:include page="header.jsp" flush="false"></jsp:include>
    <c:if test="${sessionScope.login ==null }">
        <form name="login">
            <section id="loginSection">
                아이디 : <input type="text" id="userId" placeholder="아이디">
                패스워드 : <input type="password" id="userPwd" placeholder="패스워드">
                <button type="button" id="btnLogin">로그인</button>
                <button type="button" onclick="getSignUpPage()">회원가입</button>
            </section>
        </form>
    </c:if>
</body>
<script type="text/javascript">
    function getSignUpPage() {
        location.href="signUp";
    }
    $(document).ready(function() {
        $("#btnLogin").click(function() {

            var userId = $("#userId").val();
            var userPwd = $("#userPwd").val();
            var allData = JSON.stringify({"userId": userId, "password": userPwd});
            if(userId == "") {
                $("#userId").focus();
                return;
            }
            if(userPwd == "") {
                $("#userPwd").focus();
                return;
            }
            $.ajax({
                type: "POST",
                url: "member/login",
                data: allData,
                processData: false,
                contentType: "application/json;charset=UTF-8",
                error: function (e) {
                    console.log("error : ", e);
                }
            })
        })
    });
</script>
</html>

UserDao 类:

package com.regularbbs.bbs.dao;

import static com.regularbbs.bbs.dao.UserSqls.GET_USER;

import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;

import com.regularbbs.bbs.dto.User;

@Repository
public class UserDao {

    private NamedParameterJdbcTemplate jdbc;

    private RowMapper<User> rowMapper = BeanPropertyRowMapper.newInstance(User.class);

    @Autowired
    public void setDataSource(DataSource dataSource) {
        jdbc = new NamedParameterJdbcTemplate(dataSource);
    }

    public User findUserByIdAndPw(String id, String pw) {
        try {
            System.out.println(id +":"+ pw);
            Map<String, String> map = new HashMap<>();
            map.put("userId", id);
            map.put("password", pw);
            System.out.println(map);
            return jdbc.queryForObject(GET_USER, map, rowMapper);
        }catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

服务:

package com.regularbbs.bbs.service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.regularbbs.bbs.dto.User;

public interface UserService {
    public User login(String userId, String password) throws Exception;
}



package com.regularbbs.bbs.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.regularbbs.bbs.dao.UserDao;
import com.regularbbs.bbs.dto.User;
import com.regularbbs.bbs.service.UserService;

@Service
public class UserServiceImpl implements UserService{

    @Autowired
    UserDao userDao;

    @Override
    @Transactional
    public User login(String userId, String password) throws Exception{
        return userDao.findUserByIdAndPw(userId, password);
    }
}

Controller :

package com.regularbbs.bbs.controller;

import java.util.Map;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.regularbbs.bbs.dto.User;
import com.regularbbs.bbs.service.UserService;

@Controller
public class LoginController {

    @Autowired
    UserService userService;

    @RequestMapping(value="/member/login", method=RequestMethod.POST)
    public String loginPost(@RequestBody Map<String, String> data
            , Model model, HttpSession session) throws Exception {
        System.out.println(data.get("userId") + ": " + data.get("password"));
        User loginUser = userService.login(data.get("userId"), data.get("password"));
        if(loginUser!=null) {
            session.setAttribute("login", loginUser);
            return "redirect:/";
        }else {
            return "redirect:/";
        }
    }
}

最佳答案

JDBCTemplatequeryForObject 应该返回单个唯一记录。否则,它将抛出:

  • In CorrectResultSizeDataAccessException 如果 SQL 返回大于 1 记录
  • EmptyResultDataAccessException 如果 SQL 返回无记录

通常您可以捕获此异常并将其转换为对您的应用程序有意义的异常消息。将异常重新抛出回 Controller ,以便 Spring MVC 可以处理此异常。例如:

public User findUserByIdAndPw(String id, String pw) {
    try {
        System.out.println(id +":"+ pw);
        Map<String, String> map = new HashMap<>();
        map.put("userId", id);
        map.put("password", pw);
        System.out.println(map);
        return jdbc.queryForObject(GET_USER, map, rowMapper);
    }catch(EmptyResultDataAccessException e) {
        throw new RuntimeException("User ID does not exist");
    }catch(IncorrectResultSizeDataAccessException e) {
        throw new RuntimeException("More than one users with the same Id .......");
    }
}

关于java - 如何修复 'org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0'错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57541459/

相关文章:

java - 如何使用 Java 从 Word 文件中检索数字签名数据?

java - 如何将JHawk(插件)安装到Eclipse中

spring - 在 Spring 中使用 LTW,无需使用 -javaagent

java - Libgdx 无法正确批处理计时器

java - 如何使用 Apache HttpPost 上传文件

java - 获取 JLabel 的名称

java - Spring Boot 和 Jersey 产生 ClassNotFound

java - 找不到部署 "war"的子部署 "ear"中命名的持久性单元

java - 在 Java 中禁用 Outlook 电子邮件转发

java - 不同端口上独立应用程序端点中的 Spring Jax-ws