Spring и Gson - выставлять поля только при определенных условиях
Я использую Spring с Gson для объектной сериализации.
У меня есть объекты модели, которые используют @Expose
аннотация, например:
public class Zone {
@Expose
private String name;
@Expose
private String description;
@Expose
private List<String> longList;
private String someIrrelevantVar;
}
У меня есть 2 контроллера, который служит Zone
список объектов для пользователя, например:
@RestController
class ZoneController {
@GetMapping(value = "fullData")
List<Zone> getFullZones() {
return zoneService.getZones();
}
}
@RestController
class SimpleZoneController {
@GetMapping(value = "simpleData")
List<Zone> getSimpleZones() {
return zoneService.getZones();
}
}
Проблема в List<String> longList
var - обычно там много записей (String
Это только пример, в коде это может быть сложный объект).
В моем getFullZones()
Я хочу обслуживать пользовательские зоны с этим longList
но в getSimpleZones()
Я хочу не обслуживать зоны без longList
(это никак не используется на стороне клиента).
Как это сделать?
Я мог бы перебрать список с зонами и установить longList
к нулю, но это не очень элегантное решение.
Я настраиваю Spring
использовать Gson
как это:
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(createGsonHttpMessageConverter());
super.configureMessageConverters(converters);
}
private GsonHttpMessageConverter createGsonHttpMessageConverter() {
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
//.registerTypeAdapter - register some deserializers
.create();
GsonHttpMessageConverter gsonConverter = new GsonHttpMessageConverter();
gsonConverter.setGson(gson);
return gsonConverter;
}
}
1 ответ
Создайте базовый класс ZoneSimple и расширьте еще один класс Zone, расширяет ZoneSimple. Переместите @Expose из полей в методы.
В базовом классе метод не имеет аннотации. В Зоне метод аннотирован.
В качестве альтернативы вы можете добавить класс ProxyZone, который хранит экземпляр зоны и делегирует все вызовы экземпляру. Аннотируйте прокси, как вам нужно.
Другой способ
Gson gson = new GsonBuilder()
.addSerializationExclusionStrategy(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getName().toLowerCase().contains("fieldName");
}
@Override
public boolean shouldSkipClass(Class<?> aClass) {
return false;
}
})
.create();
Получил из ответа