不要使用RepositoryRestResource插入重复数据。

3
我有一个仓库类,它公开了REST接口。
@RepositoryRestResource(collectionResourceRel = "user", path = "user")
public interface UserRepository extends CrudRepository<User, Integer> {

}

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

我已经通过约束对数据库进行了保护,现在数据库方面是没问题的。但是每次尝试插入重复对象时日志文件中都会出现异常。

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

但对于我来说,这是一个相当常见的任务,Spring可能已经实现了它。

有什么正统而简单的方法来避免重复?

1个回答

4
您可以按照手册中的说明创建并注册一个“创建前”应用程序事件监听器:
请参考以下链接: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;
    }
}

是的,谢谢。我也想到了这个解决方案(EventHandler)。 - Oleg Pavliv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接