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

Json 如果我使用Response.ResponseBuilder,Glassfish会抛出MessageException,json,jakarta-ee,glassfish,jersey,jax-rs,Json,Jakarta 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 pu

我的程序以前可以运行,但在我更新了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;
    }
}
非常感谢您的建议

非常感谢


--Sergey

为了解决导致异常的问题,我必须将实体包装在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;
}
@GET
@产生(MediaType.APPLICATION_JSON)
公众回应
{
LinkedList frends=新建LinkedList();
添加(新的Frend());
添加(新的Frend());
GenericeEntity实体=新的GenericeEntity(法语){};
Response.ResponseBuilder rb=Response.ok(实体、MediaType.APPLICATION\u JSON\u类型);
响应r=rb.build();
返回r;
}
但我遇到了与刚返回LinkedList时相同的问题: 它产生:

{“frend”:[{“id”:“0”,“name”:“Bob”},{“id”:“0”,“name”:“Bob”}]}

虽然我需要:


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

尝试将genson库添加到类路径,它将启用jsonsupport@eugen如果我转到项目属性/库/全局库,我在那里看不到“genson”库。我应该从下载并手动添加吗?如果您使用maven,您只需要向genson添加一个新的依赖项,否则您必须在站点上下载它,然后将其添加到您的应用程序中classpath@eugen我已经添加了下载的genson-0.94.jar并将其添加到库中。现在我有一条新消息:警告:WEB9052:无法加载类com.owlike.genson.ext.jersey.GensonJsonConverter,原因:java.lang.ClassNotFoundException:com.owlike.genson.ext.jersey.GensonJsonConverter和旧错误:严重:消息体编写器。。。严重:与MIME媒体类型兼容的注册消息体编写器是:application/json->com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$AppTnx!我试了几个小时。
@XmlRootElement(name="frend")
public class Frend
{
  public int id;
  public String name = "Bob";
}
@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;
}