Guice + Jersey:实体的自定义序列化

时间:2012-06-26 21:36:35

标签: dependency-injection jersey jax-rs guice

我浏览了stackoverflow和网络的其余部分以获取示例,但我找不到任何超出JSON和XML序列化的内容。

在我的webapp中,我希望将我的实体序列化为CSV。

我理解在Jersey中,我可以实现实现MessageBodyWriter和MessageBodyReader接口的提供者(或者这些类是否可以扩展?)然后让Jersey扫描包并找到并使用这些自定义实现。我怎么用Guice,使用JerseyServletModule?

另一个jax-rs框架很好地与guice集成了吗?

谢谢!

1 个答案:

答案 0 :(得分: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(“text / csv”)。