Spring Data Rest Repository不会暴露删除操作

3

我有一个用户对象的存储库,我正在尝试通过复制CRUD存储库的签名来公开删除功能:

public interface UserRepository extends Repository<User, String>{
    @RestResource(exported = false)
    User findOne(String username);

    @PreAuthorize("hasRole('ROLE_USERS_READ')")
    List<User> findAll();

    @PreAuthorize("hasRole('ROLE_USERS_WRITE')")
    User save(User user);

    @PreAuthorize("hasRole('ROLE_USERS_WRITE')")
    void delete(String username);

    @PreAuthorize("hasRole('ROLE_USERS_WRITE')")
    void delete(User user);
}

保存用户的操作很顺利:
Request URL:http://localhost:8080/api/users 
Request Method:POST
Status Code:201 Created

但是当我试图删除一个用户时,我收到了http 405错误,从我的理解来看,这意味着删除方法没有被公开暴露:

Request URL:http://localhost:8080/api/users/testUser3
Request Method:DELETE
Status Code:405 Method Not Allowed

当我使用CrudRepository进行删除调用时,它可以正常工作。欢迎任何帮助或建议。
谢谢, Ido
2个回答

4
我找到了原因: T findOne(ID id) 和 void delete(ID id) 有某种联系。 当我从findOne中删除了@RestResource(exported = false)注释后,delete开始工作了。 对我来说似乎是一个bug,或者是未记录的行为。
我没有暴露findOne,因为我的服务器正在使用它进行身份验证,所以我无法用@PreAuthorize注释它。 最终我做的是为服务器添加一个单独的方法:
@PreAuthorize("hasRole('ROLE_USERS_READ')")
User findOne(String username);

@RestResource(exported = false)
User getUserByUsername(String username);

希望这能帮助到有需要的人。

0

我也遇到了同样的问题,正在查看源代码DefaultExposureAwareCrudMethods

this.exposesDelete = Lazy.of(() -> exposes(crudMethods.getDeleteMethod()) && crudMethods.hasFindOneMethod());

所以,delete() 和 findOne() 在某种意义上是相互关联的,当一个查找方法没有被公开暴露时,例如 findById(ID),delete 就不被认为是公开暴露的。我还不得不在 deleteById(ID) 方法中添加 @Modifying,这可能是一个 bug 吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接