2012-06-26 2 views
4

Я просматривал stackoverflow и остальную часть веб-страниц для примеров, но я не могу найти ничего, что выходит за рамки JSON и XML-сериализации.Guice + Jersey: пользовательская сериализация объектов

В моем webapp я хочу, чтобы мои сущности были сериализованы как CSV, например.

Я понимаю, что в Джерси я могу реализовать поставщиков, которые реализуют интерфейсы MessageBodyWriter и MessageBodyReader (или эти классы расширяют?), А затем заставляют Джерси сканировать пакет и находить и использовать эти пользовательские реализации. Как мне это сделать с Guice, используя JerseyServletModule?

Является ли еще одна рамка jax-rs интегрированной с guice красиво?

Спасибо!

ответ

4

Вместо сканирования пакета вы должны иметь возможность добавлять привязки к вашей реализации MessageBodyWriter. Например:

public class Config extends GuiceServletContextListener { 

    @Override 
    protected Injector getInjector() { 
    return Guice.createInjector(   
     new JerseyServletModule() { 
      @Override 
      protected void configureServlets() { 
      bind(Service.class); 
      bind(CsvWriter.class); 
      serve("/services/*").with(GuiceContainer.class); 
      } 
     }); 
    } 

} 

где CsvWriter.java выглядит следующим образом:

@Singleton 
@Produces("text/csv") 
@Provider 
public class CsvWriter implements MessageBodyWriter<Foo> { 

    @Override 
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
     return Foo.class.isAssignableFrom(type); 
    } 

    @Override 
    public long getSize(Foo data, Class<?> type, Type genericType, Annotation annotations[], MediaType mediaType) { 
     return -1; 
    } 

    @Override 
    public void writeTo(Foo data, 
      Class<?> type, Type genericType, Annotation[] annotations, 
      MediaType mediaType, MultivaluedMap<String, Object> headers, 
      OutputStream out) throws IOException { 
     // Serialize CSV to out here 
    } 

} 

, а затем иметь некоторый метод в службе, что @Produces ("текст/CSV").

+0

работает как очарование, спасибо! – konstantin

+0

Не забывайте аннотировать класс как «@ Синглтон» - это вызвало некоторые проблемы для меня. – Matthias

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