Spring RestController请求冲突:调用/api/corp提示静态资源不存在
问题分析与解决方案
问题根源
- 请求映射错误:你需要的是带**请求参数(RequestParam)**的接口(如
/api/corp?name=PETA),但代码中getCorpByName和getCorpByCnpj误用了路径变量(@GetMapping("/{name}")、@GetMapping("/{cnpj}"))的映射规则,导致直接访问/api/corp带参数时,Spring找不到对应接口,触发"找不到静态资源"的错误。 - 路径冲突:
/{id}、/{name}、/{cnpj}三个路径映射完全重叠,Spring无法区分请求意图,路由逻辑彻底混乱。 - Repository方法冲突:自定义的
findById(long id)覆盖了JpaRepository自带的Optional<Corp> findById(Long id),容易引发空指针异常。
修正后的代码
1. 调整Controller请求映射
将带请求参数的接口直接映射到/api/corp,通过params属性指定必须包含的参数来区分不同接口,同时保留原有的PathVariable接口:
@RestController @RequestMapping("/api/corp") public class CorpController { private final CorpRepository corpRepository; @Autowired public CorpController(CorpRepository repository) { this.corpRepository = repository; } @GetMapping("/corps") public ResponseEntity<List<Corp>> getAllCorps() { List<Corp> corps = corpRepository.findAll(); return corps.isEmpty() ? ResponseEntity.noContent().build() : ResponseEntity.ok(corps); } @GetMapping("/{id}") public ResponseEntity<Corp> getCorpById(@PathVariable Long id) { return corpRepository.findById(id) .map(ResponseEntity::ok) .orElseGet(() -> ResponseEntity.notFound().build()); } // 仅匹配包含name参数的请求 @GetMapping(params = "name") public ResponseEntity<Corp> getCorpByName(@RequestParam("name") String corpName) { Corp corp = corpRepository.findByCorpName(corpName); return corp != null ? ResponseEntity.ok(corp) : ResponseEntity.notFound().build(); } // 仅匹配包含cnpj参数的请求 @GetMapping(params = "cnpj") public ResponseEntity<Corp> getCorpByCnpj(@RequestParam("cnpj") String corpCnpj) { Corp corp = corpRepository.findByCorpCnpj(corpCnpj); return corp != null ? ResponseEntity.ok(corp) : ResponseEntity.notFound().build(); } }
2. 修正Repository方法
删除自定义的findById(long id),直接使用JpaRepository提供的Optional<Corp> findById(Long id):
@Repository public interface CorpRepository extends JpaRepository<Corp, Long> { @Query("select c from corp c where c.corpName = :name") Corp findByCorpName(@Param("name") String corpName); Corp findByCorpCnpj(String corpCnpj); }
验证接口
修改后可正常访问以下接口:
localhost:8090/api/corp?name=PETA→ 按名称查询Corplocalhost:8090/api/corp?cnpj=PETA→ 按CNPJ查询Corplocalhost:8090/api/corp/1→ 按ID查询Corplocalhost:8090/api/corp/corps→ 获取所有Corp列表
内容的提问来源于stack exchange,提问作者Gilmar
相关产品推荐
相关产品推荐

