У меня есть простой класс POJO.
class POJO{
private boolean isEnabled,
private String field
}
У меня есть контроллер, который принимает RequestBody типа POJO. Как часть изменения я хочу включить проверку, чтобы, когда isEnabled имеет значение true в RequestBody, установите значение поля «TEST» (значение поля в RequestBody будет нулевым) и когда isEnabled имеет значение false, установите значение поля на значение, полученное от RequestBody
Я могу реализовать if...else... на контроллере/службе, но это требует большого количества репликации кода, особенно потому, что мне нужно установить несколько полей. Есть ли способ включить эту проверку в сам класс POJO?




Вам просто нужно поместить логику в конструктор dto.
class POJO {
private boolean isEnabled,
private String field;
public POJO (boolean isEnabled, String field) {
this.isEnabled = isEnabled;
this.field = isEnabled ? "TEST" : field;
}
}
Почему явный? Spring Web вызывает сам конструктор при сопоставлении объекта. Вы ничего для этого не делаете в контроллере
Я использую Lombok в своем классе POJO, и у меня есть несколько других полей, присутствующих в классе POJO, не зависящих от каких-либо других полей, если я создам конструктор с подписью public POJO (boolean isEnabled, String field) мне придется сделать явный вызов в контроллере, так как я вызывая это через конструктор Lomboks.
Ломбок — это круто, и @AllArgsConstructor — это круто, но нужно помнить о механизмах Java. Если у вас несколько полей, просто поместите их в конструктор public POJO (boolean isEnabled, String field, String field1, String field1, ...) и просто this.field1 = field1; и т. д. и только this.field = isEnabled ? "TEST" : field;. Я считаю, что эту логику следует разместить в конструкторе, а лучше в бизнес-логике @Service. Извините, если я вас не до конца понимаю.
На основе описания вопроса
когда isEnabled имеет значение true в RequestBody, установите значение поля в «TEST» (значение поля в RequestBody будет нулевым)
getField(){
return this.field == null && this.isEnabled? "TEST" : this.field.
}
Вам просто нужно убедиться, что вы не получаете доступ к field каким-либо другим способом, кроме геттерного.
Другие забавные варианты:
public void setField(String field) {
this.field = isEnabled ? "TEST" : field;
}
Всякий раз, когда Джексон сопоставляет строку json с объектом Java, он вызывает сеттеры (если они присутствуют). Это будет работать, только если преобразователь объектов Джексона DEсериализует поле isEnabled перед полем field. Так,
работает
"{\"isEnabled\":true,\"field\":\"fieldVal\"}"
не работает
"{\"field\":\"fieldVal\",\"isEnabled\":true}"
Требование выглядит несколько необычно, и было бы неплохо узнать, зачем вообще вам нужна такая вещь. Есть много способов добиться этого, и лучшее понимание проблемы, которую вы пытаетесь решить, определенно поможет выбрать правильный.
Это может быть решением, но явный вызов конструктора POJO в контроллере мне не кажется хорошим решением, особенно потому, что мой RequestBody уже имеет тип POJO.