Size: a a a

Spring Framework and more

2020 February 14

РН

Роман Нагаев in Spring Framework and more
Plomipu Dmitri
народ. Я вас умоляю помогите плиз. Ситуация срочная с ломбоком и джексоном. Короче у меня есть dto-шка в которую я получаю как результат запроса( это не важно какого. Суть не совсем в этом ).

@Data
@NoArgsConstructor
public class EmployeeTimeReportDto implements Serializable {

private Long timeReportId;
private LocalDate date;
private LocalTime start;
private LocalTime end;
private HoursAndMinutesDto totalHours;
private TimeReportStatusEnum status;
private boolean isApproved;


/*@builder e.t.c.*/
}

Но в конечной JSON-ине я получаю поле "approved" вместо "isApproved". Попробовал модифицировать геттер, чтобы джексон его увидел и поменял название поля при сериализации, добавя в дтошку следующее:

@Getter(AccessLevel.NONE)
private boolean isApproved;

@JsonProperty("isApproved")
public boolean isApproved(){
 return this.isApproved;
}

но привязанность "approved" у джексона никуда не делась, появилось при этом конечно поле ещё и "isApproved", но произошло исключение:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "approved" (class ee.h2h.h2hwebserver.controller.dto.response.job.EmployeeTimeReportDto), not marked as ignorable (7 known properties: "isApproved", "start", "end", "timeReportId", "date", "status", "totalHours"])
at [Source: (String)"[{"timeReportId":2854,"date":[2019,5,15],"start":[8,0],"end":[17,0],"totalHours":{"hours":9,"minutes":0},"status":"AUTOMATICALLY_GENERATED","approved":false,"isApproved":false},{"timeReportId":2855,"date":[2019,5,16],"start":[8,0],"end":[17,0],"totalHours":{"hours":9,"minutes":0},"status":"AUTOMATICALLY_GENERATED","approved":false,"isApproved":false})
попробуй назвать геттер isIsApproved
или сделай вместо boolean объектную обёртку
источник

l

legitzky in Spring Framework and more
Plomipu Dmitri
как сделать так чтобы джексон в той дтошке поменял имя поля для JSON-ины и вообще при сериализации и десериализации обращался к этому булевскому полю как "isApproved", а не пытался искать "approved", которого нет и я не определял ??
https://stackoverflow.com/questions/32270422/jackson-renames-primitive-boolean-field-by-removing-is

вот здесь пачка решений этой проблемы
источник

PD

Plomipu Dmitri in Spring Framework and more
Роман Нагаев
попробуй назвать геттер isIsApproved
или сделай вместо boolean объектную обёртку
а это может сработать. Ломбок очень придирчив к именам членов класса, будь то поля или методы.
источник

PD

Plomipu Dmitri in Spring Framework and more
ПОЛУЧИИИЛОСЬ
источник

PD

Plomipu Dmitri in Spring Framework and more
спасибо вам, что напомнили про is
источник

РШ

Роман Шершуков in Spring Framework and more
Plomipu Dmitri
ПОЛУЧИИИЛОСЬ
Покажи плз как сделал))
источник

PD

Plomipu Dmitri in Spring Framework and more
Роман Шершуков
Покажи плз как сделал))
в дто-шке в геттер isApproved, я изменил имя геттера на isIsApproved()

@Getter(AccessLevel.NONE)
private boolean isApproved;

public boolean isIsApproved(){
 return this.isApproved;
}

и вуаля. Если вы генерите ломбоком дтошки или POJO, то когда объявляете поля-флаги, то для геттера оказывается при автоматической генерации геттеров для полей флагов создадутся имена геттеров не с приставкой "get", а "is". Но я этого не заметил
источник

PD

Plomipu Dmitri in Spring Framework and more
о да и джексон оказался совсем не причём
источник

PD

Plomipu Dmitri in Spring Framework and more
поэтому я и ту аннотацию для маппинга поля к имени JSON-поля
@JsonProperty("isApproved")
источник

RK

Roman K in Spring Framework and more
Нет бы назвать поле просто approved
источник

RK

Roman K in Spring Framework and more
Ибо поля с префиксами get и is - старые грабли в именовании
источник

AE

Alexandr Emelyanov in Spring Framework and more
Роман Нагаев
попробуй назвать геттер isIsApproved
или сделай вместо boolean объектную обёртку
Я бы в своем проекте за такое лопатой по тыкве и в гроб
источник

PD

Plomipu Dmitri in Spring Framework and more
Alexandr Emelyanov
Я бы в своем проекте за такое лопатой по тыкве и в гроб
а чем это плохо ???
источник

AE

Alexandr Emelyanov in Spring Framework and more
Plomipu Dmitri
а чем это плохо ???
А ты подумай
источник

PD

Plomipu Dmitri in Spring Framework and more
Alexandr Emelyanov
А ты подумай
убивать за имя свойства или геттера - бред.
источник

PD

Plomipu Dmitri in Spring Framework and more
Плюс это можно пофиксить позже
источник

PD

Plomipu Dmitri in Spring Framework and more
когда будет время на рефактор тогда нужно об этом думать и в результате я много чего буду переписывать
источник

PD

Plomipu Dmitri in Spring Framework and more
но это нормально
источник

✔D

✔️Alexey Draznin in Spring Framework and more
Plomipu Dmitri
а чем это плохо ???
Это плохо тем, что код становится не читаемым и следующий разработчик , который откроет твой код , офигеет и проклянет тебя
источник

PD

Plomipu Dmitri in Spring Framework and more
✔️Alexey Draznin
Это плохо тем, что код становится не читаемым и следующий разработчик , который откроет твой код , офигеет и проклянет тебя
это нормальная практика, если то, как я написал буду я как разработчик переделывать потом, когда таски будут не такие экстренные или когда будет рефакторинг, то можно делать код читабельнее.
источник