不要使用RepositoryRestResource插入重复项

时间:2017-01-13 11:15:25

标签: spring spring-mvc spring-data-rest

我有我的存储库类,它暴露了REST接口

@RepositoryRestResource(collectionResourceRel = "user", path = "user")
public interface UserRepository extends CrudRepository<User, Integer> {

}

我想避免通过POST请求插入重复的对象。

我使用约束保护我的数据库,现在它在数据库方面没问题。但是在每次尝试插入重复对象时,日志文件中都有例外。

我可以实现一个控制器来管理POST请求并自己进行必要的检查。

但对我而言,这是一项非常常见的任务,可能已在春季实施。

避免重复的规范和简单方法是什么?

1 个答案:

答案 0 :(得分:4)

您可以在创建之前创建并注册&#39;应用程序事件监听器,详见手册:

http://docs.spring.io/spring-data/rest/docs/current/reference/html/#events

@RepositoryEventHandler 
public class UserEventHandler {

  @Autowired
  private UserRepository repository;

  @HandleBeforeCreate
  public void handleUserCreate(User user) {
    //check database

    if(duplicate){
       throw new DuplicateUserException(user);
    }
  }
}

您可以注册@ControllerAdvice以返回一些有意义的回复。例如:

@ControllerAdvice
public class ExceptionHandlingAdvice{

    @ExceptionHandler(DuplicateUserException.class)
    @ResponseStatus(HttpStatus.CONFLICT)
    @ResponseBody
    public Map<String, Object>
           handleDuplicateUserException(DuplicateUserException exception){

        Map<String, Object> map = new LinkedHashMap<>();
        map.put("duplicateUser", exception.getUser().getUserName());

        return map;
    }
}