Использовать классы, определенные в спецификации (JAX-RS) или определенные в реализации (Джерси)? - PullRequest
0 голосов
/ 09 января 2019

Я новичок в работе с REST в Java. При рассмотрении приложения, которое реализует службу REST в Java, я видел классы, которые были определены в пакете javax.ws.rs.

Насколько я понимаю, JAX-RS - это спецификация, и для ее использования требуется реализация, например, Джерси.

Почему классы, которые я вижу в приложении, являются классами JAX-RS, например, класс javax.ws.rs.core.Response. Разве занятия не должны быть уроками Джерси, как было сказано ранее? Или можно напрямую использовать «классы спецификаций»?

Я думал, что все классы, которые я увижу, будут классами из API Джерси, но это не так. Может ли кто-нибудь объяснить, когда используются классы из спецификации против реализации?

Ответы [ 3 ]

0 голосов
/ 09 января 2019

javax.ws.rs.core.Response является частью JAX-RS API, то есть спецификация .

Это абстрактный класс, и его нельзя создавать как экземпляр.

Джерси реализует Response в com.sun.jersey.core.spi.factory.ResponseImpl. Фактическое имя не имеет значения, потому что вы должны создать экземпляр Response с помощью ResponseBuilder JAX-RS API.

Например:

Response res = Response.ok().build();

Это внутренне будет искать реализацию и создавать ее экземпляр.

(Если вы включите только JAX-RS API, этот вызов не будет выполнен во время выполнения)

0 голосов
/ 09 января 2019

Основная идея спецификации заключается в том, чтобы позволить приложениям разрабатываться с использованием "стандартного" API, который может работать в любой совместимой реализации, суть в том, что приложение JAX-RS должно работать с минимальными изменениями, независимо от того, используете ли вы Джерси Reasteasy или другие реализации; и это делает их портативными.

Это не относится только к JAX-RS: то же самое можно сказать о JAX-WS, Java EE, JDBC и многих других характеристиках. Может быть возможно использовать специфичные для реализации классы (некоторые реализации даже предоставляют документацию для этого), но переносимый код JAX-RS использует стандартный API.

0 голосов
/ 09 января 2019

Спецификация действительно просто определяет API, который должна реализовывать любая реализация JAX-RS, например, Джерси.

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

Как вы правильно заметили, API также определяет некоторые абстрактные или конкретные классы. Это в основном используется в тех местах, где API определяет некоторые структуры данных, которые ожидаются методами интерфейсов. Возможно также, что существует некоторая минимальная логика уровня API, которую применяет спецификация. Они были специально выделены в этот пакет javax.ws.rs.core.

В вашем случае Response - это абстрактный класс. В этом конкретном случае настоящей причиной может быть просто то, что до Java 8 вам не разрешали иметь метод static в интерфейсе. И, как вы можете видеть, в нем много static служебных методов. Он также предоставляет конкретный метод экземпляра getHeaders(), который, по мнению проектировщиков, должен всегда быть одинаковым (опять же после Java 8 это мог бы быть default метод интерфейса).

Существует несколько других классов , которые, вероятно, существуют по тем же причинам, что и классы поддержки для API.

...