【问题标题】:MessageBodyWriter not found for media type=text/plain, type=class java.util.ArrayList, genericType=java.util.List<models.Person>找不到媒体类型 = 文本/纯文本、类型 = 类 java.util.ArrayList、泛型类型 = java.util.List<models.Person> 的 MessageBodyWriter
【发布时间】:2016-03-17 15:27:42
【问题描述】:

我编写了一个 jersey REST API 方法,它返回一个使用休眠从 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、type = class java.util.ArrayList、genericType = java.util.List 的 MessageBodyWriter。 有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: java hibernate jersey jax-rs


    【解决方案1】:

    我知道这是一个相当古老的问题 - 但是,现在有一个很好的解决方案。每当您希望返回对象列表时,可以使用以下代码:

    List<KaggleFileResponse> data = kaggleService.listFiles(xxxx);
    GenericEntity<List<KaggleFileResponse>> entity = new GenericEntity<List<KaggleFileResponse>>(data) {};
    return Response.status(HttpStatus.SC_OK).entity(entity).build();
    

    代码将列表转换为可以写回的通用实体。

    【讨论】:

      【解决方案2】:

      在这种情况下,我一直在做的是创建一个包含人员列表的 Persons 对象。可能有更好的方法,但如果你在时间紧迫的情况下想要完成它,那么这应该可行。如果它不起作用,那么我猜测没有 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;
          }
      }
      

      【讨论】:

      • 你想让我返回 Persons 类的一个实例吗?
      • 是的。将 List person() 更改为 Persons person()
      • 您可能希望删除您已配置的消息正文编写器,并让默认设置处理它。另外,你能得到任何其他的 json 响应吗?例如,如果您只返回一个字符串,它是否会返回该字符串的 JSON 化版本?
      • 看起来您的客户正在请求文本/纯媒体类型而不是 json。您可能希望确保您的请求中的 Accept Header 是 application/json。
      • 我写了我的消息正文作者,因为泽西抱怨消息正文作者不存在,是的,返回一个字符串给了我一个 json 版本的字符串。
      猜你喜欢
      • 2020-03-07
      • 2016-09-29
      • 2015-12-13
      • 2017-06-05
      • 2017-07-24
      • 2016-06-02
      • 2013-04-16
      • 2016-10-01
      • 2015-05-22
      相关资源
      最近更新 更多