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

前端之家收集整理的这篇文章主要介绍了如何使用jersey编写XML MessageBodyWriter提供程序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我并不是要特别解决任何问题,而是在学习球衣的道路上.

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

  1. @Entity
  2. @Table(name = "myentity")
  3. @XmlRootElement
  4. public class MyEntity implements serializable {
  5. // lots of methods...
  6. }

以及相应的球衣服务

  1. @Stateless
  2. @Path("entity")
  3. public class EntityFacade {
  4.  
  5. @GET
  6. @Path("{param}")
  7. @Produces({"application/xml;charset=UTF-8"})
  8. public List<MyEntity> find(@PathParam("param") String param) {
  9. List entities = entityManager.getResultList(); // retrieve list from db
  10. return entities;
  11. }
  12.  
  13. }

这给出了正确的XML响应.
假设我想编写一个MessageBodyWriter来复制相同的行为,这会产生XML响应,我怎么能这样做?

  1. @Provider
  2. public class TrasformerMessageBodyWriter implements MessageBodyWriter<Object> {
  3.  
  4. @Override
  5. public long getSize(Object o,Class<?> type,Type genericType,Annotation[] annotations,MediaType mediaType) {
  6. return 0;
  7. }
  8.  
  9. @Override
  10. public boolean isWriteable(Class<?> type,MediaType mediaType) {
  11. // return true or false depending if I want to rewrite the response
  12. }
  13.  
  14. @Override
  15. public void writeTo(Object o,MediaType mediaType,MultivaluedMap<String,Object> httpHeaders,OutputStream entityStream) throws IOException,WebApplicationException {
  16. // what do I need to write here...
  17. }
  18. }

通过使用@Provider注释进行标记,我可以看到正确调用了消息体编写器.

调用writeTo时,Object o是一个Vector,而类型genericType是一个List,但在这一点上,我完全迷失了如何在XML中转换对象.

最后,如果所有内容都已由泽西及其注释提供,那么MessageBodyWriter如何有用呢?

我再次重申,这只是一次学术活动.

通常,人们会使用MessageBodyWriter将对象转换为Jersey一无所知的数据格式.以下是将TableData域对象转换为CSV的示例:
  1. @Singleton
  2. @Produces("text/csv")
  3. @Provider
  4. public class FederationCsvWriter implements MessageBodyWriter<TableData> {
  5.  
  6. @Override
  7. public boolean isWriteable(Class<?> type,MediaType mediaType) {
  8. return TableData.class.isAssignableFrom(type);
  9. }
  10.  
  11. @Override
  12. public long getSize(TableData data,Annotation annotations[],MediaType mediaType) {
  13. return -1;
  14. }
  15.  
  16. @Override
  17. public void writeTo(TableData data,Object> headers,OutputStream out) throws IOException {
  18. Writer osWriter = new OutputStreamWriter(out);
  19. CSVWriter writer = new CSVWriter(osWriter,','"',"\r\n");
  20. if (data.getResultCount() > 0) {
  21. //Write the header
  22. writer.writeNext(data.getResult().get(0).keySet().toArray(new String[data.getResult().get(0).keySet().size()]));
  23.  
  24. //Write the data
  25. for (ModelData row: data.getResult()) {
  26. writer.writeNext(row.values().toArray(new String[row.values().size()]));
  27. }
  28. }
  29. writer.flush();
  30. }
  31.  
  32. }

在您的示例中,您可以通过自己检查对象并将结果提供给OutputStream来创建XML,也可以使用JAXB(Jersey内部使用)将对象直接编组到OutputStream.出于练习的目的,JAXB可能更有趣.

猜你在找的XML相关文章