一个简单的 curl 命令导致了这种荒谬

A simple curl command causes this ridiculousness

在我的 Spring Boot 1.5.12 应用程序中,使用 Spring Data REST 和 Spring Security,当我通过 curl:

    curl -u 'admin:password' -X DELETE http://localhost:8080/api/shoes/20

服务器因 Spring 数据 REST 异常而失败:

    ResourceNotFoundException: Resource not found!

当它试图解决荒谬的问题时 URL:

    /api/shoes/api/shoes/20

它看起来像是 /api/shoes(资源)和 /api/shoes/20(被删除的项目)的组合。这个URL当然不存在……但是这个URL是从哪里来的呢?端点很简单(使用 Lombok):

@RepositoryRestController
@AllArgsConstructor
@Slf4j
public class ShoeRepositoryRestController {
  @DeleteMapping("/shoes/{id}")
  public void delete(@PathVariable("id") Long shoeId) {
    log.error("handle delete");
  }
}

在日志中打印错误消息,然后是 ResourceNotFoundException。存储库同样通用:

@RepositoryRestResource(collectionResourceRel = "shoes", path = "shoes")
public interface ShoeRepository extends PagingAndSortingRepository<Shoe, Long> {
  // a set of query methods...
}

并且 WebSecurity 配置授权删除(显然):

  .antMatchers(HttpMethod.DELETE, "/api/shoes/**").hasRole("MANAGER")

也许 Spring 安全部门在表面上成功处理后试图对提交的 URL (/api/shoes/20) 做一些事情,但不知何故处理不当。删除处理程序后没有重定向。

有什么可能出错的想法吗?

呃!添加响应实体 return:

  @DeleteMapping("/shoes/{id}")
  public ResponseEntity<?> delete(@PathVariable("id") Long shoeId) {
    log.error("handle delete");
    return ResponseEntity.ok().build();
  }

应该更好地处理这个编程错误...