当前位置: 首页 > 面试题库 >

如何使用jersey编写XML MessageBodyWriter提供程序

洪承天
2023-03-14
问题内容

我并不是要特别解决任何问题,而是要努力学习球衣。

我有一个标记为这样的实体类:

@Entity
@Table(name = "myentity")
@XmlRootElement
public class MyEntity implements serializable {
  // lots of methods...
}

以及相应的球衣服务

@Stateless
@Path("entity")
public class EntityFacade {

    @GET
    @Path("{param}")
    @Produces({"application/xml;charset=UTF-8"})
    public List<MyEntity> find(@PathParam("param") String param) {
       List entities = entityManager.getResultList(); // retrieve list from db
       return entities;
    }

}

给出正确的XML响应。假设我想编写一个MessageBodyWriter,它复制相同的行为,并产生一个XML响应,我该怎么做?

@Provider
public class TrasformerMessageBodyWriter implements MessageBodyWriter<Object> {

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

    @Override
    public boolean isWriteable(Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType) {
        // return true or false depending if I want to rewrite the response
    }

    @Override
    public void writeTo(Object o, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders,
            OutputStream entityStream) throws IOException,
            WebApplicationException {
        // what do I need to write here...
    }
}

通过使用@Provider批注进行标记,我可以看到邮件正文编写器已正确调用。

当调用writeTo时,对象o是一个Vector,类型GenericType是一个List,但是到那时,我完全迷失了如何用XML转换对象。

最后,如果球衣及其注释已经提供了所有内容,那么MessageBodyWriter怎么有用?

我再次重申,这只是一个学术练习。


问题答案:

通常,人们会使用MessageBodyWriter来将对象转换为Jersey对其一无所知的数据格式。这是将TableData域对象转换为CSV
示例

@Singleton
@Produces("text/csv")
@Provider
public class FederationCsvWriter implements MessageBodyWriter<TableData> {

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

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

  @Override
  public void writeTo(TableData data, Class<?> type, Type genericType, Annotation[] annotations,
      MediaType mediaType, MultivaluedMap<String, Object> headers, OutputStream out) throws IOException {
    Writer osWriter = new OutputStreamWriter(out);
    CSVWriter writer = new CSVWriter(osWriter, ',', '"', "\r\n");
    if (data.getResultCount() > 0) {
      //Write the header
      writer.writeNext(data.getResult().get(0).keySet().toArray(new String[data.getResult().get(0).keySet().size()]));

      //Write the data
      for (ModelData row: data.getResult()) {
        writer.writeNext(row.values().toArray(new String[row.values().size()]));
      }
    }
    writer.flush();
  }

}

在您的示例中,您可以自己检查对象并将结果提供给来创建XML,OutputStream也可以使用JAXB(Jersey内部使用)将对象直接编组到OutputStream。为了您的锻炼目的,JAXB可能更有趣。



 类似资料:
  • 问题内容: 我目前正在做我的第一个Java项目,并且希望完全TDD。我正在使用JUnit编写测试。显然,JUnit不提供对数据提供程序的支持,这使得使用20个不同版本的参数测试同一方法变得很烦人。支持数据提供者的Java最受欢迎/最标准的测试工具是什么?我遇到过TestNG,但不知道它有多受欢迎,或与替代品相比如何。 如果有一种方法可以使这种行为成为使用JUnit的好方法,那么这也可能会起作用。

  • 我似乎无法让基于Jersey/Jetty的服务器使用默认的JAXB MessageBodyWriter for XML。我得到了这个错误: 找不到媒体类型=Application/XML的MessageBodyWriter,类型=... 泽西版本2.25。

  • 关于编写 Entity Framework Core 数据库提供程序的更多信息,请查阅 Arthur Vickers 的 你因此想要编写一个 EF Core 提供程序。 EF Core 代码基础是开源的,其中包含一些可以以引用方式使用的数据库提供程序。你可以在 https://github.com/aspnet/EntityFramework 中找到源代码。 provider-beware 标签

  • 问题内容: 如何在实现由jersey API提供的Exceptionmapper的jersey中以编程方式注册我的提供程序?我不想使用@Provider批注,而不想使用ResourceConfig注册提供程序,我该怎么做? 例如: 这是正确的方法吗? 问题答案: 我猜您没有,因为您似乎不确定如何使用它。首先,它不是必需的。如果您 确实 使用它,那应该是它自己的单独的类。您可以在那里注册映射器。 但

  • 来自Java规范SE 7版 §3.1 Unicode 程序是使用Unicode字符集编写的。 §3.2词汇翻译 使用以下三个词法翻译步骤,将原始Unicode字符流转换为一系列标记。。。 我很困惑,因为我用我的本机字符编码(Windows-1252)编写我的源代码,规范提到(?)都从原始Unicode字符流开始,然后执行词法翻译(包括Unicode转义转换)。 他们提到Unicode转义可以用来包

  • 我们正在使用PACT库进行合同测试。当前项目依赖于junit5集成。我必须扩展一个测试,使用2个提供者,而不是1: 当前版本: 我查看了发布说明,没有发现任何更新。是否有其他方法如何定义另一个提供程序?如: 或者在这种情况下junit5集成不是一个好的选择?