You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot查询PostgreSQL用户名返回null问题求助

问题分析与解决方案

刚接触Spring Boot踩这些坑太正常了,我帮你梳理下代码里的核心问题,一步步解决返回null的问题:

1. 最关键的问题:你的Service没被Spring接管

ProviderServiceImpl类没有加@Service注解!Spring根本不知道要创建这个类的实例,所以控制器里的pservice一直是null,调用方法自然拿不到数据库数据。

修复代码:给实现类加上@Service,同时把空实现的方法补全(不然就算注入成功,findAll和save还是返回null):

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

@Service // 必须加这个注解,让Spring管理这个服务Bean
public class ProviderServiceImpl implements ProviderService {
    @Autowired
    private ProviderRepo repo;

    @Override
    public List<Provider> findAll() {
        return (List<Provider>) repo.findAll(); // 补全查询所有的逻辑
    }

    @Override
    @Transactional(readOnly=true)
    public Provider getByProviderName(String providername) {
        return repo.findByProvidername(providername);
    }

    @Override
    public <S extends Provider> List<S> save(Iterable<S> arg0) {
        return (List<S>) repo.saveAll(arg0); // 补全批量保存的逻辑
    }
}

2. 控制器里的依赖注入错漏

你的DSBInfoController里,pservice和pr字段都没加@Autowired,Spring没法给你注入这些依赖;另外provider字段的注入写法也不规范,而且看起来没用到,建议简化:

@RestController
@RequestMapping(value = "/DataSubmissionInfo")
public class DSBInfoController {
    @Autowired
    private DSBInfoService service;
    
    @Autowired // 加上这个注解,让Spring注入ProviderService实例
    private ProviderService pservice;

    @RequestMapping(value ="/All", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public void getAllInfo(@RequestBody String providername) {
        System.out.println("yo yo yo");
        Provider result = pservice.getByProviderName(providername);
        System.out.println(result);
    }
}

另外提个小细节:@RequestBody String providername这种写法,如果前端传的是JSON格式(比如{"providername":"张三"}),你拿到的会是整个JSON字符串,不是具体的参数值。如果是表单提交可以改用@RequestParam String providername,如果是JSON提交,建议写个简单的DTO类来接收:

// 新建一个接收请求的DTO类
public class ProviderRequest {
    private String providername;
    // 生成getter和setter
    public String getProvidername() { return providername; }
    public void setProvidername(String providername) { this.providername = providername; }
}

// 控制器里修改参数
@RequestMapping(value ="/All", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public void getAllInfo(@RequestBody ProviderRequest request) {
    Provider result = pservice.getByProviderName(request.getProvidername());
    System.out.println(result);
}

3. 数据库连接配置要检查

确认你的application.properties(或yml)里已经配好PostgreSQL的连接信息,不然就算代码对了也连不上数据库:

# 数据库连接配置
spring.datasource.url=jdbc:postgresql://localhost:5432/你的数据库名
spring.datasource.username=你的数据库用户名
spring.datasource.password=你的数据库密码
spring.datasource.driver-class-name=org.postgresql.Driver

# JPA配置,开启SQL日志方便排查
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

开启spring.jpa.show-sql=true后,你可以在控制台看到是否执行了查询语句,如果没看到SQL输出,说明代码还没走到数据库查询那一步;如果看到SQL但没结果,那可能数据库里确实没有对应的数据,或者参数大小写不匹配(PostgreSQL默认是大小写敏感的)。

4. 检查Repo的方法命名和实体类字段

Spring Data JPA的方法命名是有规则的,你的findByProvidername要对应实体类Provider里的字段名providername(大小写要完全一致)。如果实体类里的字段是providerName,那方法名得改成findByProviderName,不然JPA生成的SQL会有问题。

最后验证步骤

  1. 启动项目,看控制台有没有报错,确认ProviderServiceImpl和ProviderRepo被Spring正常初始化了。
  2. 调用接口时,看控制台的SQL日志,确认查询语句和参数是否正确。
  3. 如果还是返回null,直接在ProviderServiceImpl的getByProviderName方法里打印传入的参数,然后手动去数据库查有没有对应的数据。

内容的提问来源于stack exchange,提问作者abaker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:41:49