Как создать обратно совместимые API-интерфейсы JAX-RS и JAX-WS?

JAX-RS и JAX-WS отлично подходят для создания API. Однако они вообще не решают проблему обратной совместимости.

Чтобы избежать поломки старого клиента, когда в API вводятся новые возможности, вы, по сути, должны принять и предоставить тот же формат ввода и вывода, что и вы делал раньше; многие из имеющихся синтаксических анализаторов XML и JSON подходят, если они находят поле, которое ни с чем не сопоставляется или имеет неправильный тип.

Некоторые библиотеки JSON, такие как Jackson и Gson, предоставляют функция, в которой вы можете указать другое представление ввода / вывода для данного объекта на основе настройки времени выполнения, что кажется подходящим способом управления версиями для многих случаев. Это позволяет обеспечить обратную совместимость путем аннотирования добавленных и удаленных полей, чтобы они отображались только в соответствии с версией API, используемого клиентом.

Ни JAXB, ни какая-либо другая библиотека привязки данных XML, которую я обнаружил на сегодняшний день, не имеют достойной поддержки для этой концепции, не говоря уже о возможности повторно использовать одни и те же аннотации как для JSON, так и для XML. Добавление его в JAXB-RI или EclipseLink Moxy кажется потенциально возможным, но пугающим.

Другой подход к управлению версиями, по-видимому, заключается в создании версий всех измененных классов, часто путем создания нового пакета каждый раз, когда публикуется API, и копирования всех измененных классов DTO, Service и Resource в новом пакете, чтобы что вся информация о типах версируется для систем привязки и диспетчеризации. Этот подход кажется мне более трудоемким.

Мой вопрос: как вы разработали поставщиков API Jave для обеспечения обратной совместимости? Что сработало, а что нет?

Ссылки на тематические исследования или сообщения в блогах по данной теме приветствуются; Я немного погуглил, но не нашел особого обсуждения этого.

6
задан Dobes Vandermeer 16 November 2010 в 18:18
поделиться