一个简单的 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();
}
应该更好地处理这个编程错误...
在我的 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();
}
应该更好地处理这个编程错误...