我希望我的网络服务能够生成“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显然没有正确链接。我该怎么做?
答案 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启动服务,则需要通过设置@Provider
或resteasy.scan
上下文参数告诉Resteasy自动扫描resteasy.scan.providers
注释到true
。{/ li>的web.xml
<context-param> <param-name>resteasy.scan</param-name> <param-value>true</param-value> </context-param>
org.jboss.resteasy.plugins.spring.SpringContextLoaderListener
注册Resteasy资源,那么您可以通过向includeFilter
添加ComponentScan
来告诉Spring扫描它们。@ComponentScan(value = "com.foo", includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Provider.class))