Java SpringRESTWebService api中的以下错误是关于什么的?

Java SpringRESTWebService api中的以下错误是关于什么的?,java,spring,mysql-workbench,Java,Spring,Mysql Workbench,我正在创建一个restapi,我正在使用javaspring,我得到了以下错误 错误: org.springframework.dao.EmptyResultDataAccessException:结果大小不正确:应为1,实际为0 我的课堂 @Override public String getLoginDetails(VendorLogin vendorlogin) { String getVendorData = "select vendor_ID from ven

我正在创建一个restapi,我正在使用javaspring,我得到了以下错误

错误: org.springframework.dao.EmptyResultDataAccessException:结果大小不正确:应为1,实际为0

我的课堂

@Override
    public String getLoginDetails(VendorLogin vendorlogin) {

        String getVendorData = "select vendor_ID from vendor_login where vendor_ID= ? 
                                 and password=?";

        String name =null;
        try{
        name = (String) jdbcTemplate.queryForObject(getVendorData,new Object[]{
       vendorlogin.getVendorLoginId(), vendorlogin.getPassWord()}, String.class);

        }catch(Exception   e){
            e.printStackTrace();            
        }
        return name;    
    }
我的控制器

@RequestMapping(value = Constants.REQ_MAP_LOGIN, 
                method = RequestMethod.POST, 
                produces = MediaType.APPLICATION_JSON_VALUE)
    public String vendorloginMethodPost(@RequestBody VendorLogin vendoridlogin)  {
        String message = Constants.EMPTY_STRING;
        String id = dao.getLoginDetails(vendoridlogin);
        String password = dao.getLoginDetails(vendoridlogin);

        if (id == null && password==null) {
            message = "login FAIL";

        }else{
            message =" login Successfully";
        }

        return message;
    }
试试看{
String getVendorData=“从供应商登录名中选择供应商ID,其中供应商ID=?和密码=?”;
字符串名称=null;
name=(String)jdbcTemplate.queryForObject(getVendorData,新对象[]{vendorlogin.getVendorLoginId(),vendorlogin.getPassWord()},String.class);
}捕获(EmptyResultDataAccessE异常){
返回null;
}

解决方案

@Override
public String getLoginDetails(VendorLogin vendorlogin) {

    String getVendorData = "select vendor_ID from vendor_login where vendor_ID= ? and password=?";


try {   
    name = (String) jdbcTemplate.queryForObject(
        getVendorData,
        new Object[]{vendorlogin.getVendorLoginId(), vendorlogin.getPassWord()},
         new RowMapper<YourVendorObject>() {
     public UserAttempts mapRow(ResultSet rs, int rowNum) throws SQLException {
        // we suppose that your vendor_ID is String in DB
        String vendor_ID = rs.getString("vendor_ID");
        // if you wanna return the whole object use setters and getters
        // from rs.getInt ... rs.getString ...
        return vendor_ID;
     }
    });

   return name;

} catch (EmptyResultDataAccessException e) {
    return null;
}       

}
@覆盖
公共字符串getLoginDetails(VendorLogin VendorLogin){
String getVendorData=“从供应商登录名中选择供应商ID,其中供应商ID=?和密码=?”;
试试{
名称=(字符串)jdbcTemplate.queryForObject(
getVendorData,
新对象[]{vendorlogin.getVendorLoginId(),vendorlogin.getPassWord()},
新的行映射器(){
公共用户尝试映射行(ResultSet rs,int rowNum)抛出SQLException{
//我们假设您的供应商ID是DB中的字符串
字符串vendor_ID=rs.getString(“vendor_ID”);
//如果要返回整个对象,请使用setter和getter
//从rs.getInt…rs.getString。。。
返回供应商ID;
}
});
返回名称;
}捕获(EmptyResultDataAccessE异常){
返回null;
}       
}
公共类EmptyResultDataAccessException扩展了IncorrectResultSizeDataAccessException

当预期结果至少有一行(或元素),但实际返回了零行(或元素)时引发数据访问异常

问题是,Spring抛出EmptyResultDataAccessException,而不是在未找到记录时返回null: java

package org.springframework.jdbc.core;

public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {

     //...
    public <T> T queryForObject(String sql, Object[] args, 
        RowMapper<T> rowMapper) throws DataAccessException {
    List<T> results = query(sql, args, new RowMapperResultSetExtractor<T>(rowMapper, 1));
    return DataAccessUtils.requiredSingleResult(results);
    }
package org.springframework.jdbc.core;
公共类JdbcTemplate扩展JdbcAccessor实现JDBCO操作{
//...
public T queryForObject(字符串sql,对象[]参数,
RowMapper(RowMapper)引发DataAccessException{
列表结果=查询(sql,args,新的RowMapperResultSetExtractor(rowMapper,1));
返回DataAccessUtils.requiredSingleResult(结果);
}
DataAccessUtils.java

package org.springframework.dao.support;

public abstract class DataAccessUtils {

    //...
    public static <T> T requiredSingleResult(Collection<T> results) 
         throws IncorrectResultSizeDataAccessException {
    int size = (results != null ? results.size() : 0);
    if (size == 0) {
        throw new EmptyResultDataAccessException(1);
    }
    if (results.size() > 1) {
        throw new IncorrectResultSizeDataAccessException(1, size);
    }
    return results.iterator().next();
    }
package org.springframework.dao.support;
公共抽象类DataAccessUtils{
//...
公共静态T requiredSingleResult(收集结果)
抛出不正确的SultSizeDataAccessException{
int size=(results!=null?results.size():0);
如果(大小==0){
抛出新的EmptyResultDataAccessException(1);
}
如果(results.size()>1){
抛出新的IncorrectResultSizeDataAccessException(1,大小);
}
返回results.iterator().next();
}
请在此处查看:


好的,您对DB的请求需要一个结果,并且正好是一个结果,但没有找到结果。很好地解释了这一点。检查返回queryForObject是否为null您必须使用EmptyResultDataAccessException而不是Exception编辑您的try catch以了解更多详细信息,请在我更改sql查询时检查下面的我的答案,,,,,,,,,,,,字符串getVendorData=“从供应商登录名中选择供应商ID,其中供应商ID='”+vendorlogin.getVendorLoginId()+“'和密码='”+vendorlogin.getPassWord()+“””;将出现以下错误:java.sql.SQLException:参数索引超出范围(1>参数数量,即0)。编辑您的答案并通过编辑代码来找出问题