У меня есть объект JPA, который может получать обновления через HTTP API. Контроллер работает только с представлением (DTO) сущности Person и не предоставляет никаких @Entity
аннотированных классов.
Ниже приведен упрощенный фрагмент класса сущности:
public class Person {
@Id
@GeneratedValue
@GenericGenerator(name = "uuid", strategy = "uuid2")
private UUID uuid;
private String title;
private String prefix;
private String firstName;
private String lastName;
private String description;
}
@RestController
предоставляет конечную точку PUT
, которая принимает представление человека как @RequestBody
, а UUID
- как @PathVariable
.
. Следующий метод класса PersonService
должен только выполните обновление, если человек существует:
@Override
public Person update(Person person, UUID uuid) {
personRepository.findById(uuid) (1)
.orElseThrow(() -> new Exception(ommitted));
//boolean existsById = personRepository.existsById(uuid); (2)
person.setUuid(uuid);
return personRepository.save(person);
}
Выполнение следующих результатов теста в java.lang.UnsupportedOperationException
@Test
public void updatePersonWillFail() throws Exception {
ModelMapper converter = new ModelMapper();
ObjectMapper mapper = new ObjectMapper();
Person person = EntityProvider.getPersonBienhaus();
person = personRepository.saveAndFlush(person);
// I assume this will be immediately written so the database/underlying entity?
// Skipping this and creating a Representation of the person with the same properties
//person.setDescription("This is an updated description!");
PersonModel personModel = ModelProvider.getPersonModelBienhaus();
// Updating the person 'description' only for the representation
personModel.setDescription("This is an updated description!");
personModel.setUuid(person.getUuid());
mockMvc.perform(put("/persons/{uuid}", personModel.getUuid())
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.content(mapper.writeValueAsBytes(personModel)))
.andExpect(status().isOk());
}
Примечание : Когда я не использую PersonRepository
в тесте, чтобы сохранить сущность, но вместо этого выполнить POST
, все работает как положено.
Что я также не понимаю в приведенном выше PersonService update()
- Метод заключается в том, что (1)
не выдает исключение, но когда раскомментирует (2)
, это приводит к false
, хотя человек, очевидно, существует в противном случае (1)
должен был выбросить исключение.
Теперь мои вопросы:
- Как я могу проверить т он обновляет без выполнения предыдущих
POST
операций? - Как может получиться, что
(1)
не выдает исключение, но (2)
- это false
- Что было бы подходящим способом для проверить описанный сценарий?
- Чего мне не хватает, что приводит меня в замешательство?
Спасибо за вашу помощь!
Обновление:
- Использование
@Version
на объекте решает вопрос №. 2. Я предполагаю, что UUID вызывает некоторые проблемы, поэтому он не может определить, существует объект или нет. Но я до сих пор не знаю, почему он не создает исключение.