我有一个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
答案 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)方法中,也许是一个错误?