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

Spring RestController请求冲突:调用/api/corp提示静态资源不存在

问题分析与解决方案

问题根源

  1. 请求映射错误:你需要的是带**请求参数(RequestParam)**的接口(如/api/corp?name=PETA),但代码中getCorpByName和getCorpByCnpj误用了路径变量(@GetMapping("/{name}")、@GetMapping("/{cnpj}"))的映射规则,导致直接访问/api/corp带参数时,Spring找不到对应接口,触发"找不到静态资源"的错误。
  2. 路径冲突:/{id}、/{name}、/{cnpj}三个路径映射完全重叠,Spring无法区分请求意图,路由逻辑彻底混乱。
  3. 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 → 按名称查询Corp
  • localhost:8090/api/corp?cnpj=PETA → 按CNPJ查询Corp
  • localhost:8090/api/corp/1 → 按ID查询Corp
  • localhost:8090/api/corp/corps → 获取所有Corp列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:03:21