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();

Получил из ответа

Другие вопросы по тегам