2014-10-05 2 views
0

У меня есть этот ресурс (упрощенный):Пользовательский контент расширение обработки переговоры и «Accept» заголовок с Джерси

@Path("/cars{extension:(\\.(xml|json))?}") 
public class Cars { 

    @GET 
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
    public Response searchCars(@PathParam("extension") String extension) { 
     System.out.println("extension: " + extension); 
     //... 
     return Response.status(200).entity(output).build(); 
    } 
} 

И я хочу, например (но бизнес-логика может измениться), чтобы вернуть ответ XML если расширение является xml, или Json, если расширение является json, независимо от заголовка «Accept». По умолчанию я хочу использовать заголовок Accept, но предположим, что какой-то фиктивный парень хочет получить доступ к моему веб-сервису с помощью Ajax и мало знает о заголовках, я хочу упростить его, просто добавив соответствующее расширение ,
С этим фрагментом я могу получить расширение (если оно есть), но я не знаю, как изменить стратегию соответственно.

Спасибо!

EDIT:
Так что я нашел что-то, что я могу использовать .тип() из Response.ResponseBuilder как:

Response.ResponseBuilder responseBuilder = Response.status(200).entity(output); 
if ([some test about extention or header]) 
    responseBuilder.type(MediaType.APPLICATION_XML); 
// other tests 

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

ответ

0

Для этого я бы использовал ContainerResponseFilter, поэтому вам не нужно делать это для каждого пути.

Сначала проверьте расширение - aka MediaType dummy guy любит получать.

Затем проверьте, требуется ли MediaType для вашей службы. Если нет, то я бы сказал, что манекен парень имеет жесткие удачи;)

Пример код [джерси 2.x]:

import java.io.IOException; 
import java.lang.annotation.Annotation; 
import java.util.List; 

import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerResponseContext; 
import javax.ws.rs.container.ContainerResponseFilter; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.ext.Provider; 

@Provider 
public class EntityResponseFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext reqc , ContainerResponseContext resc) throws IOException { 
     MediaType mediaType = this.getMediaTypeFromExtentionOrHeader(); // TODO 
     List<MediaType> mediaTypes = reqc.getAcceptableMediaTypes(); 
     if(mediaTypes.contains(mediaType)) { 
      resc.setEntity(resc.getEntity(), new Annotation[0], mediaType); 
     } 
     // ... 
    } 
} 

Надежда это было полезно как-то :)

+0

Спасибо за Вы отвечаете. Кстати, «Dummy guy» не уничижителен ;-) Таким образом, он работает с фильтром, но я работал с родительским классом, который обрабатывал эти материалы для моих ресурсов. Один вопрос о фильтре и ContainerResponseContext, просто для производительности, я хотел бы быть уверенным, что setEntity() не вызывается после того, как сущность была сериализована в первый раз (после вызова ресурса)? Вы знаете? Чтобы быть более ясным, я хочу быть уверенным, что сериализация/сортировка не происходит перед фильтром. –

+0

Маршаллинг - одна из последних вещей, которые будет выполнять Джерси. Поэтому сначала фильтры, чем сортировка, ... – zyexal

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