覆盖Spring Data Rest上的默认保存实体

时间:2015-12-07 21:00:33

标签: java spring spring-data spring-data-rest

我想覆盖默认的CrudRepository save方法,该方法也导出到Rest api:

@RepositoryRestResource(path = "users")
public interface UserRepository extends JpaRepository<User, Long> {


    @Override
    @RestResource(exported=false)
    User save(User user);


}

在我的ApiController中,我设置了这样的请求映射:

    @RequestMapping(value = "/", produces = "application/json", method = RequestMethod.POST)
        @ResponseBody
        public ResponseEntity<Resource<User>> registerUser(
          @RequestParam("name") String name, 
          @RequestParam("alias") String alias, 
          @RequestParam("email") String email, 
          @RequestParam("password") String password,
          @RequestParam("dateOfBirth") String dateOfBirth,
          @RequestParam("imageIdentifier") String imageIdentifier) {

         User user = new User();
         //try {
         // userReposiotry.save(user);
         //} catch (Exception e) {

         //}
         Resource<User> resource = toResource(user);
         return new ResponseEntity<Resource<User>>(resource, HttpStatus.OK);
}

问题是当我尝试POST到localhost:8080 / api / users时它会返回“Method Not allowed”,这很好,因为它设置为“exported = false” 但是如何为localhost实现自己的POST:8080 / api / users? 感谢

2 个答案:

答案 0 :(得分:0)

另一种方法是创建一个自定义存储库实现,如下所示:

@RepositoryRestResource(path = "users")
    public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom {

    @Override
    @RestResource(exported=false)
    User save(User user);
}

public interface UserRepositoryCustom {
    <S extends User> S save(T entity);
}

public UserRepositoryImpl implements UserRepositoryCustom {
    <S extends User> S save(T entity) {
        // implementation code...
    }
}

如果您查看CrudRepository,我会找到方法<S extends T> S save(S entity);,这就是我从save(..)获取的方法,只需将extends T更改为extends User

我要注意的另一件事是类/接口的命名,尽量保持一致。我命名它们的方式应该适合您,UserRepositoryImpl必须具有该名称才能使其正常工作。

执行此操作您无需设置exported=false,您可以像平常一样使用save()方法。

答案 1 :(得分:-1)

找到解决方案:

Button

在我的问题中,CrudRepository保存仍设置为exported = false。