@jvmchat

Страница 2573 из 2890
Андрей
24.06.2018
20:21:33
поле name1 всё равно сериализуется в dto в null ты ж вроде и так нулл хочешь?
Нет, присвоить null только тем полям, которые определены в json и не трогать остальные. Из дтошки присваивается энтити.

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
Нет, присвоить null только тем полям, которые определены в json и не трогать остальные. Из дтошки присваивается энтити.
Вообще, погуглив (тоже крутой совет), люди пишут, что если поля нет в JSON, то джексон просто не будет вызывать сеттер на это поле. https://stackoverflow.com/a/19551195/6395606 https://github.com/FasterXML/jackson-datatype-jdk8/issues/2#issuecomment-389191907

вы точно уверены, что 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 не будет затронута

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
Предыдущий вариант предпочтительнее

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

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

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

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

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

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

Admin
ERROR: S client not available

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

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

Cargeh
24.06.2018
21:07:40
Например использовать опшианалы в полях класса, в аргументах
Щас бы врываться в обсуждение и говорить что кто-то что-то делает не так, не прочитав изначальную проблему...

Marat
24.06.2018
21:07:51
Например использовать опшианалы в полях класса, в аргументах
опшионалы нужны, чтоб избавиться от npe, нуллы там хранить не надо

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

Cargeh
24.06.2018
21:09:47
Marat
24.06.2018
21:09:48
Опшионалов в полях класса нет и не планируется
в аргументы функции не надо передавать их тоже, чтобы не было o == null || o.isPresent()

Андрей
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 используйте и все

там в одну строчку нулл-ы игнорируются

Мытко
24.06.2018
21:42:07
Какие?
Иди детей воруй

Marat
24.06.2018
21:42:11
а джексон умеет работать с Optional?
умеет https://github.com/FasterXML/jackson-modules-java8/tree/master/datatypes

Мытко
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
Проблема же была в том, что этот класс используется для проведения запросов в базу

И что не было понятно, что нужно обновлять при апдейте

Страница 2573 из 2890