Spring Data Rest Repository不会公开删除

时间:2016-04-27 22:11:03

标签: java spring-data-rest

我有一个User对象的存储库,我试图通过从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 个答案:

答案 0 :(得分:4)

我找到了原因: T findOne(ID id)和void delete(ID id)以某种方式连接。 当我从findOne中删除@RestResource(exported = false)注释时,delete开始工作。 对我来说似乎是一个错误,或者是无证件的行为。

我没有暴露findOne,因为我的服务器正在使用它进行身份验证,因此我无法使用@PreAuthorize对其进行注释。 我最终做的是为服务器添加一个单独的方法:

@PreAuthorize("hasRole('ROLE_USERS_READ')")
User findOne(String username);

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

希望这有助于某人。

答案 1 :(得分:0)

遇到同样的问题,请查看源代码DefaultExposureAwareCrudMethods

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

实际上,在未公开find方法(例如findById(ID))的情况下,delete()和findOne()可以这样连接,即认为删除不公开。我还必须将@Modifying添加到deleteById(ID)方法中,也许是一个错误?