Минимизируйте данные, которые будут сериализованы для веб-сервисов Spring, отображающих данные JSON

1

До сих пор я использовал STRUTS в качестве структуры MVC.
Одной из лучших возможностей, на которые можно было справиться, было: Список регулярных выражений с разделителями-запятыми может быть передан в результат JSON для ограничения того, какие свойства будут сериализованы. ТОЛЬКО свойства, соответствующие любому из этих регулярных выражений, будут включены в сериализованный вывод.

Например:

<action name="GetAllGroups" class="com.example.action.GroupAction"          method="getAllGroups">
            <result type="json">
                <param name="includeProperties">
                    ^groups\[\d+\]\.id, ^groups\[\d+\]\.name, ^groups\[\d+\]\.parent\.id
                </param>
            </result>
</action>

Это приведет к сериализации только желаемых параметров списка групп, что уменьшит полезную нагрузку или избыточные данные (например: другие атрибуты группы, такие как время создания, время обновления, члены и т.д.),

Теперь мы используем SPRING MVC при переходе на веб-сервисы и рендеринг JSON типа данных для всех запросов. Со следующей конфигурацией:

<bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jsonConverter" />
            </list>
        </property>
    </bean>

API-интерфейс контроллера выглядит следующим образом:

@RequestMapping(value = "/groups", method = RequestMethod.GET)
public @ResponseBody
List<Group> getGroups() throws Exception {
    log.info("Getting all the groups");
    return myService.getAllGroups();
}

Это нормально работает, и я беспокоюсь только о том, сколько данных сериализуется. Все атрибуты объекта Group сериализуются джексоном.

Использование @JsonIgnore для нежелательного атрибута похоже на статическое связывание. Поскольку он игнорирует атрибуты с @JsonIgnore для сериализации для всех запросов, где Группы обслуживаются клиентом. (Например: для заполнения групп в выпадающем списке будет достаточно только их идентификатор и имя, но чтобы полностью заполнить его на клиенте в качестве профиля, мне нужны все данные)

Поэтому я предпочитаю конфигурацию, специфичную для STRUTS, которая может применяться для каждого запроса.

Теги:
spring
serialization
struts2

1 ответ

0

Самое простое - создать новый класс GroupResource который содержит только те поля, которые вы хотите вернуть из API, и преобразовать их из Group в GroupResource в свой метод контроллера.

Это позволяет вам явно контролировать то, что сериализуется в JSON в коде приложения, а не полагаться на аннотации и настройку сериализатора Jackson.

  • 0
    Это был бы вариант, но, учитывая динамические требования, я мог бы в конечном итоге создать более одного GroupResource на основе перестановок и комбинаций требуемых атрибутов.
  • 1
    В этом случае аннотации в классе Group также могут не работать. Вы можете сделать так, чтобы ваш метод контроллера просто записывал выходные данные непосредственно в выходной поток HttpServletResponse и, возможно, передавал объект через другой сериализатор в зависимости от определенных условий.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню