2014-10-10 7 views
3

Итак, я понимаю, что вы указываете тип, но почему? При каких условиях это имеет значение. Например, если у меня есть следующий метод, и я комментирую аннотацию @Produces, он все равно возвращает JSON.Зачем использовать REST @Produces annotation

@GET 
@Path("/json") 
//@Produces({MediaType.APPLICATION_JSON}) 
public String getJson(){ 
    return toJson(getResults()); 
} 

В документе API говорится: «Если не указано, контейнер предполагает, что может быть произведен любой тип». Так почему я не хочу, чтобы контейнер предполагал это?

+0

Когда я кодирую скорость, я оставляю аннотации и все еще работает просто отлично. Результатом является результат. – NightSkyCode

ответ

6

Я думаю, что это зависит от реализации JAX-RS, но вот объяснение Джерси их @Produces аннотации: https://jersey.java.net/documentation/latest/jaxrs-resources.html#d0e1809

В основном, это до клиента, чтобы определить, какой тип контента сервера должен выплюнуть обратно. Если клиент поддерживает более одного типа контента, вы можете иногда задавать приоритет типов контента для возврата, для данного метода:

@Produces({"application/xml; qs=0.9", "application/json"}) 

В приведенном выше примере, если клиент принимает как «приложение/XML »и« application/json »(одинаково), то сервер всегда отправляет« application/json », так как« application/xml »имеет более низкий коэффициент качества.

+0

Объяснение этого объяснения объясняет Джерси. Например, клиент может просто указать путь, который находится на уровне класса, а затем ввести тот, который соответствует типу MIME, который он ищет. – MattC

0

Если клиент запрашивает ваш JSON только ресурс с Accept: application/xml; заголовка, то, строго говоря, сервер должен возвращать код 406 (не допускается) статус, а не строку JSON.

Если вы используете аннотацию @Provides, контейнер должен обрабатывать этот случай для вас, и именно поэтому вы должны его использовать.

Смежные вопросы