出现内部服务器错误求助:Spring Boot余额查询接口代码排查
排查Spring Boot内部服务器错误的问题点
我帮你梳理下代码里导致内部服务器错误的几个关键问题:
1. Controller路径变量名不匹配
你的@GetMapping路径是"/Transferabalance/{id}",但@PathVariable指定的是"Accbalance"——路径里的变量名是{id},但你要绑定的参数名是Accbalance,这会导致Spring无法正确解析请求路径里的参数,直接抛出参数绑定异常。
修复方案:
把路径里的变量名改成和@PathVariable一致,同时修正空值判断逻辑(Spring Data JPA的查询方法返回空列表而非null):
@GetMapping("/Transferabalance/{Accbalance}") public List<Transaction> transfer(@PathVariable("Accbalance") long Accbalance) throws ResourceNotFoundException { List<Transaction> balance = Transservice.findByAccbalance(Accbalance); if(balance.isEmpty()) throw new ResourceNotFoundException("NO BALANCE"); else return balance; }
2. Repository层查询返回类型不匹配
你的findByAccbalance方法声明返回List<Transaction>,但native SQL写的是select ACCBALANCE from TRANSACTION——这个查询只返回单个数值字段,却试图映射成Transaction实体列表,这会触发严重的类型转换异常,是内部服务器错误的核心诱因。
修复方案:
如果需求是根据Accbalance值查询对应交易记录,正确的写法有两种:
- 用Spring Data JPA自动生成查询(推荐,避免手写SQL错误):
public interface TransactionRepository extends CrudRepository<Transaction,Long> { List<Transaction> findByAccbalance(long Accbalance); }
- 手写native SQL(需保证查询结果能映射到实体):
@Query(value="select * from TRANSACTION where ACCBALANCE = ?1",nativeQuery = true) List<Transaction> findByAccbalance(long Accbalance);
3. 额外排查建议
- 检查
Transaction实体类与数据库表TRANSACTION的字段映射是否一致,比如ACCBALANCE列在实体中对应的属性名是否正确,必要时用@Column注解明确指定列名。 - 开启Spring Boot调试日志,在
application.properties中添加logging.level.org.springframework=DEBUG,通过详细的错误栈信息快速定位问题。
内容的提问来源于stack exchange,提问作者Hari Shankar
相关产品推荐
相关产品推荐

