gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:02:25 25 4
gpt4 key购买 nike

我不是要特别解决任何问题,而是在学习 Jersey 的道路上。

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

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

和相应的 Jersey 服务

@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 时,Object o 是一个 Vector,Type genericType 是一个 List,但此时我完全不知道如何将对象转换为 XML。

最后,如果 jersey 及其注释已经提供了所有内容,那么 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();
}

}

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

关于java - 如何使用 jersey 编写 XML MessageBodyWriter 提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16741853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com