RESTEasy 无法识别自定义消息正文编写器

2024-01-26

我的MessageBodyWriter

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

    public static final String CONTENT_DISPOSITION_HEADER = "Content-Disposition";     
   //$NON-NLS-1$
    private final static HeaderDelegate<ContentDispositionHeader> header = RuntimeDelegate.getInstance().createHeaderDelegate(ContentDispositionHeader.class);

    public long getSize(JaxbList t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return -1;
    }

    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return CsvSerializer.class.isAssignableFrom(type);
    }

    public void writeTo(JaxbList t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders,
                    OutputStream entityStream) throws IOException, WebApplicationException {

        // set content disposition. This will enable browsers to open excel
        ContentDispositionHeader contentDispositionHeader = ContentDispositionHeader.createContentDispositionHeader(MediaTypeUtils.CSV_TYPE);
        contentDispositionHeader.setFileName("representation"); //$NON-NLS-1$
        httpHeaders.putSingle(CONTENT_DISPOSITION_HEADER, header.toString(contentDispositionHeader));

        Charset charset = Charset.forName(ProviderUtils.getCharset(mediaType));
        OutputStreamWriter writer = new OutputStreamWriter(entityStream, charset);

        PrintWriter printWriter = new PrintWriter(writer);
        Iterator<String[]> rows = ((CsvSerializer) t).getEntities();
        while (rows.hasNext()) {
            printWriter.println(CsvWriter.getCSVRow(rows.next()));
        }
        printWriter.flush();
    }
}

我的 REST 应用程序

@Path("app/v3")
@GZIP
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, "text/csv"})
 public class ApplicationREST

申请延期

@ApplicationPath("/")
public class JaxRsActivator extends Application {

  private Set<Object> singletons = new HashSet<Object>();
  private Set<Class<?>> classes = new HashSet<Class<?>>();

  public JaxRsActivator() {
    singletons.add(new CSVMessageBodyWriter());
    classes.add(ApplicationREST.class);
  }

  @Override
  public Set<Object> getSingletons() {
    Set<Object> defaults = super.getSingletons();
    singletons.addAll(defaults);
    return singletons;
  }

  public Set<Class<?>> getClasses() {
    return classes;
  }
}

当我在调试模式下运行时,我可以点击 JaxRsActivator 类,因此我知道提供程序正在加载。但是我收到错误“找不到 MessageBodyWriter 类型的响应对象:net.comp.jaxb.JaxbList 媒体类型:text/csv”


根据您上面的代码,您的CSVMessageBodyWriter正在被调用,但它失败了isWriteable check.

Your isWriteablecheck 总是会返回 false。您正在检查是否JaxbList可分配自CSVSerializer。这总是会失败,而你的CSVMessageBodyWriter将被视为无法处理text/csv.

尝试将 isWriteable 方法更改为以下内容:

public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) 
{
    return true;
}

这将序列化所有text/csv带注释的方法。如果你想限制它JaxbList那么你可以这样做:

public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) 
{
    ParameterizedType paramType = (ParameterizedType) genericType;

    if(paramType.getRawType().equals(JaxbList.class))
    {
        return true;
    }

    return false;
}

这是配置自定义的简单工作示例MessageBodyWriter:

应用

public class ProductGuideApplication extends Application
{
    private Set<Object> singletons = new HashSet<Object>();
    private Set<Class<?>> classes = new HashSet<Class<?>>();

    public ProductGuideApplication() 
    { 
        singletons.add(new CSVMessageBodyWriter());
        classes.add(FooResource.class);
    }

    @Override
    public Set<Object> getSingletons()
    { 
        return singletons;
    }

    @Override
    public Set<Class<?>> getClasses() 
    {
        return classes;
    }
}

Resource

@Path("/foo")
public class FooResource
{
    @GET
    @Produces("text/csv")
    public List<Consumer> getConsumers()
    {
        Consumer consumer1 = new Consumer();
        consumer1.setId("1234");
        consumer1.setGender("Male");

        Consumer consumer2 = new Consumer();
        consumer2.setId("2345");
        consumer2.setGender("Male");

        List<Consumer> consumers = new ArrayList<Consumer>();
        consumers.add(consumer1);
        consumers.add(consumer2);

        return consumers;
    }
}

消息体编写器

@Provider
@Produces("text/csv")
public class CSVMessageBodyWriter implements MessageBodyWriter<List<Consumer>>
{
    @Override
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) 
    {
        ParameterizedType paramType = (ParameterizedType) genericType;

        if(paramType.getRawType().equals(List.class))
        {
            if(paramType.getActualTypeArguments()[0].equals(Consumer.class))
            {
                return true;
            }
        }

        return false;
    }

    @Override
    public long getSize(List<Consumer> t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) 
    {
        return 0;
    }

    @Override
    public void writeTo(List<Consumer> t, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders,
            OutputStream entityStream) throws IOException,
            WebApplicationException 
    {
        //Write your CSV to entityStream here.
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RESTEasy 无法识别自定义消息正文编写器 的相关文章

随机推荐

  • 将阻塞函数集成到 Swift async 中

    据我所知 异步 SwiftTask不应该阻塞 异步工作线程必须始终向前推进 如果我有一个 100 异步 Swift 应用程序 但需要引入一些阻塞任务 那么正确的方法是什么 不会阻塞任何 swift 异步线程池工作线程 我假设需要异步线程池之
  • 根据 React.js 中的 TextField 值启用或禁用按钮

    I am making a form like 我希望每当用户更改 标签 输入文本时添加按钮就处于活动状态 我正在使用 Material ui 并制作了一个输入组件 const SingleInput props gt
  • C# 测试资源

    我正在使用 Microsoft Visual Studio 测试框架 并且我的一些测试需要 xml 文件作为输入 目前 我已将它们放置在 TestProject 中的资源目录下 并通过 whatever 路径名访问它们 我想在使用测试资源文
  • jar中的类在运行时未找到,但用于编译

    从 ant 文件构建此项目后 我收到一个包含我构建的所有类的 jar 当我尝试运行这个 jar 时 出现以下错误 Exception in thread main java lang NoClassDefFoundError javax m
  • sed :在带有换行符的特定模式后插入行

    我们想要修改 plist 文件 以便在匹配模式后应该使用 sed shell 命令插入几行 plist文件格式如下
  • Flutter如何共享资产文件夹中的图像?

    使用此代码 我不断收到错误 ENOENT 没有此类文件或目录 null null null 如何共享资产文件夹中的文件 Directory directory await getApplicationDocumentsDirectory S
  • UserTransaction 和 EntityManager 如何交互?

    这是一个学术问题 我没有与此相关的损坏代码 我只是想扩展我对幕后发生的事情的理解 我在 JPA DAO 中针对典型的 JSF Web 应用程序使用的代码模式 从书籍和教程中复制 基本上是这样的 public class someDAO Pe
  • Python (pdb) - 排队要执行的命令

    我正在实现一个用于 Python 开发的 断点 系统 该系统允许我调用一个函数 该函数本质上调用 pdb set trace 我想要实现的一些功能需要我从代码控制 pdbwhile我在 set trace 上下文中 Example disa
  • 嵌套数组元素的跳过和限制

    我想在文档的嵌套数组中应用跳过和限制分页 如何执行此操作 有效方法 我的文档记录如下 id name ObjectArray url value 我想检索多个文档 每个文档包含 n 条记录 我在用 in在查找查询中根据 id 检索多条记录
  • 使用 XSLT 1.0 的百分比编码

    我正在使用 XSLT 1 0 并且不应该使用 XSLT 2 0 我有以下 xml 其中的值
  • Eclipse-CDT:添加自定义构建步骤的最佳方法是什么?

    我的项目中有一个文件 需要使用外部工具进行编译 其输出是一对 c 和 h 文件 将其集成到我的 Eclipse CDT 构建中的最佳方法是什么 理想情况下 我可以使用相对路径引用外部工具 理想情况下 Eclipse 会知道我是否更改了该文件
  • 如何在 Ubuntu 上并行运行 Apache Tomcat 和 Apache2?

    我遇到了问题 我同时进行 pHp 开发和 JSF 开发 但我遇到了一个问题 你看 不久前我安装了 Apache2 以便我可以做 pHp 但一个月后我不得不安装 Apache Tomcat 这时候问题就出现了 我遵循了所有的指示tomcat
  • 让 collat​​z 程序自动完成无聊的事情

    我正在尝试使用 用 Python 自动化无聊的东西 第 3 章末尾找到的项目指南来编写 Collat z 程序 我正在使用Python3 4 0 以下是项目概要 编写一个名为collatz 它有一个名为 number 的参数 如果数字是偶数

  • 标签语义替代用法

    嗯 我知道是没有语义的 问题是当有这样的段落时 朋友你好 今天我学到了一个新技巧 但我不会告诉你 然而 好吧 我只是开玩笑 Lorem ipsum dolor sat amet consectetur 脂肪精英 朗克斯在麦格纳 Nulla
  • Raven.Client.Exceptions.Database.DatabaseDoesNotExistException:'数据库'*****'不存在

    我在用RavenTestDriver对于我的 net core 单元测试 这是我的配置RavenTestDriver在我的单元测试解决方案中 public class TestHostBuilder RavenTestDriver IAsy
  • SQL1159 DB2 .NET 数据提供程序初始化错误,原因代码 2

    我正在尝试从运行 Windows 7 64 位的开发机器中的 NET 2 0 应用程序连接到 DB2 我在 open 方法中收到此错误 无法找到解决方案 异常类型 InvalidOperationException ExceptionMes
  • 在 OpenCV 中将较小的图像叠加在较大的图像中

    我想用 Opencv 中的图像替换图像的一部分 I used cvGetPerspectiveMatrix with a warpmatrix and using cvAnd and cvOr 但无法让它发挥作用 这是当前显示图像和替换图像
  • 浏览器不请求 favicon.ico 的原因有哪些?

    我正在编写一个位于服务器根目录的简单网页 其快捷方式图标位于 favicon ico 但我的浏览器从不请求此 favicon ico 我在 html 中包含了以下内容 当我打开开发人员工具的网络选项卡时 我看到对 192 168 0 1 网
  • 使用 group_by 的简单 Rails 3.1 视图

    我正在工作的网站上有一个菜单 食物菜单 表中的每条记录还包含一个类别字段 此类别可以是汉堡 零食 饮料或他们想要对食品进行分类的任何其他内容 我正在尝试显示菜单 其中的项目按此类别字段分组 到目前为止我的尝试 food item menus
  • RESTEasy 无法识别自定义消息正文编写器

    我的MessageBodyWriter Provider Produces text csv public class CSVMessageBodyWriter implements MessageBodyWriter