Patch сущности в REST Spring MVC

183
12 декабря 2021, 13:20

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

 @RequestMapping(value = "{id}", method = RequestMethod.PATCH, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public  ResponseEntity<T> update(@PathVariable Long id, @RequestBody T t) {
    T e = (T) getService().findById(id);
    if (e == null) {
        getLogger().warn("Entity: {} not found in method /update", id);
        throw new EntityNotFoundException(id);
    }
    /*
    for (Map.Entry<Object, Object> map : entity.entrySet()) {
        Field fielde = ReflectionUtils.findField(getEntityClass(), map.getKey());
        fielde.setAccessible(true);
        ReflectionUtils.setField(fielde, e, map.getValue());
    }
    */
    getService().update(e);
    getLogger().info("Entity: {} successful updated", e);
    return new ResponseEntity<>(e, HttpStatus.OK);
}

Пример поля со связью, которое пытаюсь обновить:

класс Project:

 @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JoinTable(name = "user_project",
        joinColumns = {@JoinColumn(name = "project_id", referencedColumnName = "id")},
        inverseJoinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")}
)
@LazyCollection(LazyCollectionOption.FALSE)
@Fetch(FetchMode.SELECT)
private List<User> team = new ArrayList<>();

класс User:

@JsonIgnore
@ManyToMany(mappedBy = "team", fetch = FetchType.LAZY)
@LazyCollection(LazyCollectionOption.FALSE)
@Fetch(FetchMode.SELECT)
private List<Project> projects;

Что имею в виду под "не обновляются связи в БД через рефлексию" : Передаю запрос в таком виде:

{
"projects": [{"id":45}]

}

Возвращается обновленная сущность, но в поле project передано просто значение, а не объект:

{
"id": 7,
"name": "Олег",
"login": "omaslo",
"password": "123",
"city": "Москва",
"phoneNumber": "555",
"position": null,
"tasks": [],
"deleted": null,
"project": [
    {
        "id": 45
    }
],
"posotionUser": null

}

А должно быть как-то так:

{
"id": 45,
"name": "RU06297",
"endCustomer": {
    "id": 8,
    "name": "ЗапСибНефтехим",
    "contactPersonName": "Валерий",
    "contactPersonPhone": "111",
    "adressLegal": "Адрес",
    "adressSend": "Адрес",
    "adressDelivery": "Адрес"
},
"team": []

}

READ ALSO
Дженерики, метод of

Дженерики, метод of

Почему две данных реализации работают? В чем их принципиальное отличие?

288
Помощь с версткой блоков

Помощь с версткой блоков

Как сверстать эти блоки на чистом html и css?

136
Фон картинкой в CSS

Фон картинкой в CSS

Всем привет:) Не могу фон сделать под размер страницы, постоянно фон как бы не помещается на страницуВсе говорят про background-size: cover; Но он у меня...

189