
Андрей
24.06.2018
20:21:33

Grigory
24.06.2018
20:21:51
а чем (как) ты десериалиузешь
видимо это Георгий хоетл узнать

Андрей
24.06.2018
20:22:04
Джексоном

Google

Grigory
24.06.2018
20:22:08
...
вот тогда ответ выше
мы прям все ток джексон используем тут чтоб джейсон выковыривать (дефолт либа как никак и других нет)

Sergey
24.06.2018
20:23:17
Джексоном
И да, совет тебе - задавай вопросы точнее
Тебе очень сильно повезло что у тебя стали выуживать нужную информацию, так бы просто проигнорировали

Андрей
24.06.2018
20:27:30
Спасибо за совет

Grigory
24.06.2018
20:27:54
ну и джейсон библиотек больше чем одна, тут в этом соль еще.

Андрей
24.06.2018
20:28:58
Десериализатор под конкретную сущность здесь не подойдёт, нужно разработать универсальный механизм апдейта полей базы

Georgy
24.06.2018
20:29:15
ААА
причем тут база

Андрей
24.06.2018
20:29:58
Из дтошки энтити апдейтится

Cargeh
24.06.2018
20:30:42
вы точно уверены, что jackson скидывает ранее инициализированные поля на null?

Google

Андрей
24.06.2018
20:32:59
Так дтошка чистая на входе. Параметр контроллера.

Cargeh
24.06.2018
20:33:19

Андрей
24.06.2018
20:33:27
Да

Georgy
24.06.2018
20:33:49
тогда в чем проблема?

Андрей
24.06.2018
20:36:23
Из ДТО апдейтится энтити. Проблема в том, что нужно апдейтить только те поля, которые в джейсоне явно указаны для зануления.
И не трогать остальные

Sergey
24.06.2018
20:37:02
Следующий совет - ты решил что проблема в этом и решать следует на этом уровне
Хибер?

Андрей
24.06.2018
20:37:43
Да, хибер

Sergey
24.06.2018
20:37:52
@DynamicUpdate
Поищи что это

Андрей
24.06.2018
20:38:19
Видел
Хотя...

Sergey
24.06.2018
20:38:44
Чем не устроило?

1337
24.06.2018
20:41:54
как же хочется реактивный jdbc...

Андрей
24.06.2018
20:42:15
Он генерит скуль только для тех полей, которые менялись. Но, если пришла дто с нулевыми полями, а нам нужно сбрасывать только те, которые в джейсоне указаны
Т.е., в идеальном случае, нужно, чтобы джейсон был своего рода запросом на апдейт таблицы

Georgy
24.06.2018
20:44:57
ну наконец-то
теперь понятно в чем проблема
у тебя в DTO нет информации о том, отсутсвовало это поле в JSON или присутствовало со значением null

Google

Андрей
24.06.2018
20:46:55
Нет, это обычный POJO

Georgy
24.06.2018
20:47:09
в DTO в обеих случаях будет null

Андрей
24.06.2018
20:47:33

Georgy
24.06.2018
20:47:49
как ты собираешься использовать в таком случае DTO для того чтоб доставить эту информацию до Entity?

Cargeh
24.06.2018
20:47:56
Как вариант - в dto следить, какие сеттеры вызывал jackson при десериализации.
И на этапе конвертации dto -> entity, проверять
if(dto.isFieldSet()){
entity.field = dto.field;
}
Если в JSON пришел null, поле обнулится в entity. Если поля не было в JSON -> сеттер не вызван -> entity не будет затронута

Андрей
24.06.2018
20:49:43

Georgy
24.06.2018
20:50:53
в сеттере прямо
void setField(Integer value) {
this.isFieldSet = true;
this.field = value;
}

Андрей
24.06.2018
20:55:20
Тогда следующий вопрос - как переопределить сеттер, если используется ломбок?

Georgy
24.06.2018
20:56:00
очевидно просто руками его написать

Cargeh
24.06.2018
20:59:06
void setField(Integer value) {
this.isFieldSet = true;
this.field = value;
}
Либо так
public class Object {
private Optional<Object> field = Optional.empty();
public void setField(Object o) {
this.field = Optional.of(o);
}
}
И потом проверять на
if(isValueSet(field)) {
entity.field = getValue(dto.field);
}
public <T> boolean isValueSet(Optional<T> o) {
return o == null || o.isPresent();
}
public <T> T getValue(Optional<T> o) {
return o == null ? null : o.get()
}
Хотя я щас все это написал и как-то слишком получается... В голове это выглядело лучше

Андрей
24.06.2018
21:00:26
Предыдущий вариант предпочтительнее

Pavel
24.06.2018
21:00:43

Georgy
24.06.2018
21:00:43
а джексон умеет работать с Optional?

Андрей
24.06.2018
21:00:58
Не знаю

Georgy
24.06.2018
21:01:00

Pavel
24.06.2018
21:01:22
И что это за дикая проверка на null ?

Marat
24.06.2018
21:01:23
Но вещь все равно сложная..
почитай в вики про CRTP
кстати, в с++ и c# это имеет большее практическое применение, из-за того, что там нет legacy-наследства, вынуждающего к type-erasure

Google

Georgy
24.06.2018
21:01:56

Владислав
24.06.2018
21:02:11

Cargeh
24.06.2018
21:03:02
И что это за дикая проверка на null ?
Читай выше. 3 состояния: сеттер был вызыван и засетил null, сеттер не был вызыван (Optional.empty()), сеттер был вызван и поставлено какое-то значение

Marat
24.06.2018
21:03:46

Vladimir
24.06.2018
21:04:07
у групповых операций в CHM (search, reduce) есть какие-то преимущества, кроме использования fork/join?

Admin
ERROR: S client not available

Pavel
24.06.2018
21:04:33
Ты что-то делаешь не так

Cargeh
24.06.2018
21:05:04

Андрей
24.06.2018
21:05:28
Например?

Marat
24.06.2018
21:06:07
4-state boolean )))
помню здесь кто-то предлагал уже хранить в Optional<Boolean> 4 разных значения: null, empty, false, true

Евгений
24.06.2018
21:06:36

Pavel
24.06.2018
21:06:49
Например использовать опшианалы в полях класса, в аргументах

Cargeh
24.06.2018
21:07:40

Marat
24.06.2018
21:07:51

Андрей
24.06.2018
21:08:05
Опшионалов в полях класса нет и не планируется

Pavel
24.06.2018
21:09:02

Cargeh
24.06.2018
21:09:47

Marat
24.06.2018
21:09:48

Андрей
24.06.2018
21:12:12
Идея с булевыми флагами мне очень понравилась, спасибо

Google

Marat
24.06.2018
21:13:54
Когда-нибудь ты уйдешь из проекта, а потом кому-то этот код поддерживать (хоть в жабадоке мотивацию напиши, почему так сделано)

Андрей
24.06.2018
21:17:23
Тоже верно

Митко Соловец?
24.06.2018
21:35:20

1337
24.06.2018
21:41:11
jackson используйте и все
там в одну строчку нулл-ы игнорируются

guga
24.06.2018
21:41:40

Мытко
24.06.2018
21:42:07

Marat
24.06.2018
21:42:11

Мытко
24.06.2018
21:42:19
Что ты тут забыл, сисярпист треклятый?

guga
24.06.2018
21:42:35
Я не помню с ним проблем, если честно.

Митко Соловец?
24.06.2018
21:42:42

guga
24.06.2018
21:43:06
Да и это довольно удобный способ показать что параметр или поле не обязательны

Мытко
24.06.2018
21:44:14
Проблема же была в том, что этот класс используется для проведения запросов в базу
И что не было понятно, что нужно обновлять при апдейте