Java 创建自定义提供程序并链接到web服务
我希望我的web服务生成“text/csv” 我已经包含了来自apache的maven依赖项CsvSerializerProvider。它是一个提供程序,生成“文本/csv”,如下所示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
@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向
注册Resteasy资源,那么您可以通过向org.jboss.Resteasy.plugins.Spring.Spring.SpringContextLoaderListener
组件扫描添加
来告诉Spring扫描它们includeFilter
我已更改了实现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))