2016-10-11 65 views
1

我有2个类。 PostComment。邮政@HandleBeforeCreate工作正常,但评论@HandleBeforeCreate不。我想知道为什么?Spring Data Rest @HandleBeforeCreate方法不叫

PostEventHandler类:

@Component 
@RepositoryEventHandler(Post.class) 
public class PostEventHandler { 

    @HandleBeforeCreate 
    public void setPostAuthorname(Post Post) { 
     System.out.println("This method called successfully!"); 
    } 
} 

PostRepository接口:

@RepositoryRestResource(collectionResourceRel = "posts", path = "posts") 
public interface PostRepository extends MongoRepository<Post, String> { 

} 

没有找到Post类定制控制器/资源实施。但在我的评论仓库接口我有一个自定义的方法,它看起来像这样:

@RepositoryRestResource(collectionResourceRel = "comments", path = "comments") 
public interface CommentRepository extends MongoRepository<Comment, String> { 
    // announceId is a field in Comment class. Get method works fine 
    List<Comment> findAllByAnnounceId(String announceId); 
} 

CoomentEventHandler类:

@Component 
@RepositoryEventHandler(Comment.class) 
public class CommentEventHandler { 

    @HandleBeforeCreate 
    public void setCommentAuthorUsername(Comment comment) { 
     System.out.println("This method never gets invoked!"); 
    } 
} 

定制CommentController实现:

@RepositoryRestController 
public class CommentController { 

    @Autowired 
    private AnnounceRepository announceRepository; 

    @Autowired 
    private CommentRepository commentRepository; 

    @RequestMapping(value = "/announces/{announceId}/comments", method = RequestMethod.GET) 
    public ResponseEntity<List<Comment>> getAllComments(@PathVariable("announceId") String announceId) { 
     System.out.println("This method called successfully with a valid PathVariable!); 
     // Custom interface method works fine 
     List<Comment> comments = commentRepository.findAllByAnnounceId(announceId); 
     if (comments != null) { 
      System.out.println("This method called successfully!); 
      return new ResponseEntity<>(comments, HttpStatus.OK); 
     } 
     return new ResponseEntity<>(HttpStatus.NOT_FOUND); 
    } 

    @RequestMapping(value = "/announces/{announceId}/comments", method = RequestMethod.POST) 
    public ResponseEntity<Comment> createComment(@PathVariable("announceId") String announceId, @RequestBody Comment comment) { 
     System.out.println("This method called successfully with a valid PathVariable and Comment object!"); 
     Announce announce = announceRepository.findOne(announceId); 
     if (announce != null) { 
      commentRepository.save(comment); 
      announce.getCommentList().add(comment); 
      announceRepository.save(announce); 
      return new ResponseEntity<>(HttpStatus.CREATED); 
     } 
     return new ResponseEntity<>(HttpStatus.NOT_FOUND); 
    } 
} 

回答

1

事件处理程序(如@ HandleBeforeCreate带注释的方法)仅在暴露的Spring Data REST端点上触发HTTP请求时才会被调用。这就是POST请求在/ posts路径上触发setPostAuthorname方法的原因。 在CommentController的情况下,您公开自定义请求映射方法,并直接调用方法存储库,这样就永远不会触发事件处理程序。您使用这种方法的唯一方法是在您的CommentController中注入Event Handler Bean并调用相应的方法befor并调用save存储库方法,或者直接从用户界面调用,即从客户端调用,并执行来自UI的createComment方法的逻辑,通过暴露/评论API路径进行POST请求。

问候。