不要使用 RepositoryRestResource 插入重复项
Don't insert duplicates with RepositoryRestResource
我有我的存储库 class,它公开了 REST 接口
@RepositoryRestResource(collectionResourceRel = "user", path = "user")
public interface UserRepository extends CrudRepository<User, Integer> {
}
我想避免通过 POST 请求插入重复对象。
我用约束保护了我的数据库,现在在数据库端没问题了。但是每次尝试插入重复对象时,日志文件中都会出现异常。
我可以实现一个控制器来管理 POST 个请求并自己进行必要的检查。
但对我来说这是一个很常见的任务,可能已经在 Spring 中实现了。
避免重复的规范且简单的方法是什么?
您可以创建并注册一个 'before create' 应用程序事件侦听器,如手册中所述:
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
到 return 一些有意义的回复。例如:
@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;
}
}
我有我的存储库 class,它公开了 REST 接口
@RepositoryRestResource(collectionResourceRel = "user", path = "user")
public interface UserRepository extends CrudRepository<User, Integer> {
}
我想避免通过 POST 请求插入重复对象。
我用约束保护了我的数据库,现在在数据库端没问题了。但是每次尝试插入重复对象时,日志文件中都会出现异常。
我可以实现一个控制器来管理 POST 个请求并自己进行必要的检查。
但对我来说这是一个很常见的任务,可能已经在 Spring 中实现了。
避免重复的规范且简单的方法是什么?
您可以创建并注册一个 'before create' 应用程序事件侦听器,如手册中所述:
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
到 return 一些有意义的回复。例如:
@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;
}
}