我编写了一个简装REST API方法,它返回一个使用hibernate从mysql后端查询的人员列表。这是方法
@Path("Person")
@GET
@Produces(MediaType.TEXT_PLAIN)
public List<Person> person()
{
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Criteria cr = session.createCriteria(Person.class);
List persons = cr.list();
GenericEntity<List<Person>> list = new GenericEntity<List<Person>>(persons) {};
tx.commit();
session.close();
return persons;
}
这是我的MessageBodyWriter
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class PersonMessageBodyWriter implements MessageBodyWriter<Person> {
@Override
public long getSize(Person arg0, Class<?> arg1, Type arg2, Annotation[] arg3, MediaType arg4) {
// TODO Auto-generated method stub
return -1;
}
@Override
public boolean isWriteable(Class<?> type, Type arg1, Annotation[] arg2, MediaType arg3) {
return Person.class.isAssignableFrom(type);
}
@Override
public void writeTo(Person person, Class<?> type, Type type1, Annotation[] arg3, MediaType arg4,
MultivaluedMap<String, Object> arg5, OutputStream out) throws IOException, WebApplicationException {
// TODO Auto-generated method stub
out.write(person.toString().getBytes());
}
}
当我向上述方法提出请求时,我得到了 严重:找不到媒体类型= text / plain的MessageBodyWriter,type = class java.util.ArrayList,genericType = java.util.List。 有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
在这种情况下,我一直做的是制作一个包含人员列表的人物对象。可能有一种更好的方法,但如果你的时间紧迫,并希望完成它,那么这应该工作。如果它不起作用,那么我猜不会有JSON编组工作,在这种情况下你会遇到配置问题。
import java.util.ArrayList;
import java.util.List;
public class Persons
{
private List<Person> persons = new ArrayList<>();
public List<Person> getPersons()
{
return persons;
}
public void setPersons(List<Person> persons)
{
this.persons = persons;
}
}
答案 1 :(得分:0)
我知道这是一个很老的问题-但是,现在有一个很好的解决方案。每当您希望返回对象列表时,都可以使用以下代码:
List<KaggleFileResponse> data = kaggleService.listFiles(xxxx);
GenericEntity<List<KaggleFileResponse>> entity = new GenericEntity<List<KaggleFileResponse>>(data) {};
return Response.status(HttpStatus.SC_OK).entity(entity).build();
代码将列表转换为可以写回的通用实体。