До сих пор я использовал 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, которая может применяться для каждого запроса.
Самое простое - создать новый класс GroupResource
который содержит только те поля, которые вы хотите вернуть из API, и преобразовать их из Group
в GroupResource
в свой метод контроллера.
Это позволяет вам явно контролировать то, что сериализуется в JSON в коде приложения, а не полагаться на аннотации и настройку сериализатора Jackson.
HttpServletResponse
и, возможно, передавал объект через другой сериализатор в зависимости от определенных условий.