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

Java 创建自定义提供程序并链接到web服务,java,resteasy,Java,Resteasy,我希望我的web服务生成“text/csv” 我已经包含了来自apache的maven依赖项CsvSerializerProvider。它是一个提供程序,生成“文本/csv”,如下所示 @Provider @Produces("text/csv") public class CsvSerializerProvider implements MessageBodyWriter<CsvSerializer> { } 当我使用curl试图到达端点时,我得到一个错误 Could not f

我希望我的web服务生成“text/csv”

我已经包含了来自apache的maven依赖项CsvSerializerProvider。它是一个提供程序,生成“文本/csv”,如下所示

@Provider
@Produces("text/csv")
public class CsvSerializerProvider implements MessageBodyWriter<CsvSerializer> {
}
当我使用curl试图到达端点时,我得到一个错误

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

我可以很好地获得.xml,因为它是标准的,但显然它没有正确链接。如何执行此操作?

错误消息表示您正在尝试编写
JaxbList
,但您的
MessageBodyWriter
配置为编写
CsvSerializer
的对象

如果您的方法返回一个
JaxbList
,并且您想让Resteasy将其转换为CSV,那么您需要一个处理
JaxbList
MessageBodyWriter

@Provider
@Produces("text/csv")
public class CsvSerializerProvider implements MessageBodyWriter<JaxbList> {
}
此外,您还需要确保您的提供商已向Resteasy注册:

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

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

  • 如果您正在使用Spring向
    org.jboss.Resteasy.plugins.Spring.Spring.SpringContextLoaderListener
    注册Resteasy资源,那么您可以通过向
    组件扫描添加
    includeFilter
    来告诉Spring扫描它们

我已更改了实现MessageBodyWriter的方法。我正在使用应用程序的子类引导服务,但仍然找不到我的提供者。但是,我的应用程序扩展目前为空。@Cam Sonaris-我已编辑了我的答案。很抱歉,我可能误解了javax.ws.rs.core.Application的文档。我的印象是自动扫描是自动进行的,但根据最新的文档,您似乎需要手动注册它们,如我上面所示,或者使用resteasy.scan上下文参数。谢谢。但是现在我得到一个错误“找不到相对/my/path/of full path/my/full/path的资源”@Cam Sonaris-您还需要将资源类添加到该集合中。我以为你们已经在做了,因为你们是应用程序的子类。我不明白你们把我的资源类添加到那个集合是什么意思。哪一套?
@Provider
@Produces("text/csv")
public class CsvSerializerProvider implements MessageBodyWriter<JaxbList> {
}
@Provider
@Produces("text/csv")
public class CsvSerializerProvider implements MessageBodyWriter<Foo> {
}
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;
  }
}
<context-param>
   <param-name>resteasy.scan</param-name>
   <param-value>true</param-value>
</context-param>
@ComponentScan(value = "com.foo", 
               includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Provider.class))