0

我希望我的网络服务能够生成“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 显然没有正确链接。我该怎么做?

4

1 回答 1

0

错误消息指出您正在尝试编写一个JaxbList,但您MessageBodyWriter的配置是编写一个 的对象CsvSerializer

如果您的方法返回 aJaxbList并且您想让 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那么您可以在您的应用程序子类中注册您的提供程序。

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;
  }
}
  • 如果您将服务作为 servlet 启动,org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher那么您需要告诉 Resteasy 自动扫描注释@Providerresteasy.scan方法是在您的.resteasy.scan.providerstrueweb.xml
<context-param>
   <param-name>resteasy.scan</param-name>
   <param-value>true</param-value>
</context-param>
  • 如果您使用 Spring 来注册您的 Resteasy 资源,org.jboss.resteasy.plugins.spring.SpringContextLoaderListener那么您可以告诉 Spring 通过添加一个includeFilterto来扫描它们ComponentScan
@ComponentScan(value = "com.foo", 
               includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Provider.class))
于 2013-07-03T23:36:57.267 回答