2017-01-13 6 views
2

У меня есть класс репозитория, который выставляет интерфейс RESTНе вставляйте дубликаты RepositoryRestResource

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

} 

Я хочу, чтобы избежать вставки повторяющихся объектов с помощью запросов POST.

Я защитил мою базу данных ограничениями, и теперь это нормально на стороне БД. Но есть исключения в файле журнала при каждой попытке вставить повторяющиеся объекты.

Я могу реализовать контроллер, где я управляю POST-запросами и самостоятельно выполняю проверки.

Но для меня это довольно распространенная задача, которая уже может быть реализована весной.

Что такое канонический и простой способ избежать дубликатов?

ответ

3

Вы можете создать и зарегистрировать «прежде чем создавать» приложения слушателя событий, как описано в руководстве:

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; 
    } 
} 
+0

Да, спасибо. Я тоже пришел к этому решению (EventHandler). –