我并不是要特别解决任何问题,而是要努力学习球衣。
我有一个标记为这样的实体类:
@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集成不是一个好的选择?