如果我使用Response.ResponseBuilder,Glassfish会抛出MessageException

时间:2013-04-14 23:59:36

标签: json java-ee glassfish jersey jax-rs

我的程序曾经工作,但在我更新了NetBeans和Glassfish后,它声称要抛出: com.sun.jersey.api.MessageException:Java类java.util.LinkedList的消息正文编写器,Java类型类java.util.LinkedList,未找到MIME媒体类型application / json

我已经花了几天时间搜索解决方案,但没有任何作用。所以我创建了一个小概念证明代码:

@Path("frend")
@Stateless
public class MyFrend
{
    @Context
    private UriInfo context;

    public MyFrend(){}

    // Throws: com.sun.jersey.api.MessageException: A message body writer for Java class java.util.LinkedList, and Java type class java.util.LinkedList, and MIME media type application/json was not found

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAssets()
    {
        List<Frend> frends = new LinkedList<Frend>();
        frends.add( new Frend() );
        frends.add( new Frend() );

        Response.ResponseBuilder rb = Response.ok( frends, MediaType.APPLICATION_JSON_TYPE );

        Response r = rb.build();
        return r;
    }
}

如果我将返回类型“Response”替换为“List”,它可以工作,但将列表包装到根元素中,这会破坏与现有客户端的兼容性。这是代码:

@Path("ok")
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Frend> getAssetsOk()
{
    List<Frend> frends = new LinkedList<Frend>();
    frends.add( new Frend() );
    frends.add( new Frend() );
    return frends;
}

它产生:{“ frend ”:[{“id”:“0”,“name”:“Bob”},{“id”:“0”,“name”: “鲍勃”}]}

我需要:[{“id”:“0”,“name”:“Bob”},{“id”:“0”,“name”:“Bob”}]

以防万一这是我的“Frend”课程。

@XmlRootElement(name="frend")
public class Frend
{
  public int id;
  public String name = "Bob";
}

非常感谢任何建议。

非常感谢,

- 塞吉

1 个答案:

答案 0 :(得分:1)

要解决导致异常的问题,我必须在GenericEntity类中包装实体:

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getAssets()
{
    LinkedList<Frend> frends = new LinkedList<Frend>();
    frends.add( new Frend() );
    frends.add( new Frend() );

    GenericEntity<LinkedList<Frend>> entity = new GenericEntity<LinkedList<Frend>>(frends) {};

    Response.ResponseBuilder rb = Response.ok( entity, MediaType.APPLICATION_JSON_TYPE );
    Response r = rb.build();
    return r;
}

然后我遇到了与刚刚返回LinkedList时相同的问题: 它产生:

{ “的弗洛伊德”:[{ “ID”: “0”, “名称”: “鲍勃”},{ “ID”: “0”, “名称”: “鲍勃” }]}

我需要的时候:

[{ “ID”: “0”, “名称”: “鲍勃”},{ “ID”: “0”, “名称”: “鲍勃”}]