创建自定义提供程序并链接到Web服务

时间:2013-07-03 18:37:28

标签: java resteasy

我希望我的网络服务能够生成“text / csv”。

我已经从apache中包含了maven依赖关系CsvSerializerProvider。它是一个提供者并生成“text / csv”,如下所示

@Provider
@Produces("text/csv")
public class CsvSerializerProvider implements MessageBodyWriter<CsvSerializer> {
}

现在在我的网络服务中我@Produces(“text / csv”)就像这样

@Produces({MediaType.APPLICATION_XML, "text/csv"})
public class RecordREST {
}

当我使用curl尝试命中我的端点时,我收到错误

Could not find MessageBodyWriter for response object of type: jaxb.JaxbList of media type: text/csv

我可以得到.xml,因为它的标准,但csv显然没有正确链接。我该怎么做?

1 个答案:

答案 0 :(得分:0)

错误消息指出您正在尝试编写JaxbList,但您的MessageBodyWriter已配置为编写CsvSerializer的对象。

如果您的方法返回JaxbList,并且您希望Resteasy将其转换为CSV,那么您将需要MessageBodyWriter来处理JaxbList

@Provider
@Produces("text/csv")
public class CsvSerializerProvider implements MessageBodyWriter<JaxbList> {
}

理想情况下,您的Web服务上的方法将返回一个域对象Foo,该对象将在您的案例中使用JAXB注释进行注释,然后您的CsvSerializerProvider将如下所示:

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

此外,您需要确保您的提供商在Resteasy注册:

  • 如果您在JBoss AS7 @Provider中运行,则会自动处理注释扫描而无需任何额外配置

  • 如果您使用javax.ws.rs.core.Application的子类引导您的服务,那么您可以在您的Application子类中注册您的提供程序。

public class MyApplication extends Application
{
  private Set<Object> singletons = new HashSet<Object>();

  public MyApplication() 
  { 
      singletons.add(new MyCustomMessageBodyWriter());
      singletons.add(new MyResource());
  }

  @Override
  public Set<Object> getSingletons()
  { 
      return singletons;
  }
}
  • 如果您使用org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher作为servlet启动服务,则需要通过设置@Providerresteasy.scan上下文参数告诉Resteasy自动扫描resteasy.scan.providers注释到true。{/ li>的web.xml
<context-param>
   <param-name>resteasy.scan</param-name>
   <param-value>true</param-value>
</context-param>
  • 如果您使用Spring通过org.jboss.resteasy.plugins.spring.SpringContextLoaderListener注册Resteasy资源,那么您可以通过向includeFilter添加ComponentScan来告诉Spring扫描它们。
@ComponentScan(value = "com.foo", 
               includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Provider.class))