2015-12-07 29 views
0

我想重寫默認CrudRepository保存方法還出口到REST API:覆蓋默認保存實體春數據休息

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


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


} 

在我ApiController我已成立了一個requestmapping這樣的:

@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); 
} 

問題是,當我嘗試發佈到本地主機:8080/API /用戶,它返回一個「不允許的方法」,因爲它被設置爲「出口=假」 但我怎麼能實現自己的POST這是個好對於localhost:8080/api/users? 感謝

回答

0

找到了解決辦法:

@BasePathAwareController 
@RequestMapping("/users") 
public class RestApiController implements ResourceProcessor<Resource<User>>{ 
    @Autowired 
    private EntityLinks entityLinks; 

    @RequestMapping(method=RequestMethod.POST) 
    @ResponseBody 
    public ResponseEntity<Resource<User>> saveUser(@Param("name") String name) { 
     // Testing 
     System.out.println(name); 
     Resource<User> resource = new Resource<>(new User()); 
     return new ResponseEntity<>(resource , HttpStatus.OK); 
    } 

    @Override 
    public Resource<User> process(Resource<User> resource) { 
      LinkBuilder lb = entityLinks.linkFor(User.class); 
      resource.add(new Link(lb.toString())); 
     return resource; 
    } 
} 

的CrudRepository保存仍設置爲輸出= false作爲我的問題。

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 Textends User

我會關注的另一件事是類/接口的命名,儘量保持一致。我給他們起名的方式應該適合你,UserRepositoryImpl必須有這個名字才能起作用。

這樣做您不必設置exported=false,您可以像使用普通方法一樣使用save()方法。