Я разрабатываю API JAX-RS.Должно ли EntityManager # merge работать с не идентифицируемым объектом?
POST /myentities
PUT /myentities/{myentityId}
Мне понравилось это.
@PUT
@Path("/{myentityId: \\d+}")
@Consumes(...)
@Transactional
public Response updateMyentity(
@PathParam("myentityId") final long myentityId,
final Myentity myentity) {
if (!Objects.equal(myentitiyId, myentity.getId())) {
// throw bad request
}
entityManager.merge(myentity);
return Response.noContent().build();
}
Мне вдруг стало любопытно и допрошено самому себе.
Когда клиент вызывает после запроса
PUT /myentities/101 HTTP/101
Host: ..
<myentity id=101>
</myentity>
Возможно ли, что запрос обрабатывается, даже если нет ресурсов определены 101
?
Я проверил тест.
acceptEntityManager(entityManager -> {
// persist
final Device device1 = mergeDevice(entityManager, null);
entityManager.flush();
logger.debug("device1: {}", device1);
assertNotNull(device1.getId());
// remove
entityManager.remove(device1);
entityManager.flush();
assertNull(entityManager.find(Device.class, device1.getId()));
// merge again, with non existing id
final Device device2 = entityManager.merge(device1);
entityManager.flush();
logger.debug("device2: {}", device2);
});
Я обнаружил, что второе слияние работает и назначается новый идентификатор. Это нормально? Не должно EntityManager#merge
лишить операцию?
ли это означает, что любой клиент может атаковать API, вызвав
PUT /myentities/<any number>
?