Jackson JSON生成HTTP状态500,XML工作

我目前正在使用Jackson将Java对象序列化为JSON和XML作为REST Web服务的响应。 我有以下带注释的Java对象:

@XmlRootElement(name = "Product") @XmlAccessorType(XmlAccessType.FIELD) public class ProductDetailsView { @XmlElement private int id; @XmlElement private long EAN; @XmlElement private String manufacturer; @XmlElement private String modelname; @XmlElementWrapper(name = "onlineCompetitors") @XmlElement(name = "competitor") private List onlineCompetitors; 

现在,前几个字段是原始类型,它们在JSON和XML中都完美地工作(事实上,有更多的原始字段)。 但是,从我添加OnlineCompetitorView列表的那一刻起,JSON序列化就不再起作用,并导致应用程序生成HTTP状态500(“内部服务器错误”)。 但是,当我使用application / xml作为接受的内容类型时,它可以完美地工作。

正确的XML响应:

  1 5901234123457 Samsung   1 Shop1 4 488.95 7   2 Shop2 5 498.95 12    

所以XML工作正常,但是当我从服务请求application / json时(GlassFish 4.0)会产生内部服务器错误。 这是OnlineCompetitorView的注释方式:

 @XmlAccessorType(XmlAccessType.FIELD) public class OnlineCompetitorView { @XmlElement private final int id; @XmlElement private final String shopname; @XmlElement private final int rating; @XmlElement private final double productPrice; @XmlElement private final int stock; 

我也尝试在OnlineCompetitorView中添加@ XmlRootElement-annotation,但这并没有改变任何东西。 由于我没有从GlassFish收到任何错误,我真的不知道如何解决问题。 简单的Web服务看起来像这样:

 @GET @Path("/get/product/{ean}") @Produces({"application/xml", "application/json"}) public ProductDetailsView getProduct(@PathParam("ean") Long EAN) { ProductDetailsView pdv = service.getProductDetailsView(EAN); return pdv; } 

那么,如果XML工作正常,而JSON如何创建内部服务器错误呢? 有人可以帮我解决这个问题吗? 任何帮助是极大的赞赏!


编辑!

因为我仍然不知道为什么JSON不起作用,而XML确实在继续开发我的应用程序。 在这样做时,我偶然发现了一个新问题,可能与第一个问题有关,这就是我更新问题的原因。

我创建了一个小而简单的测试,返回一个非常简单的带注释的POJO,它不能与XML或JSON一起工作(虽然更复杂的’Product’-POJO正在工作,尽管只有XML)。

现在,错误日志仍然显示没有错误,但glassfish返回给我一些东西:

 FINE: Trying to locate com/eid/instoreapp/JSONView/jaxb.properties FINE: not found FINE: Checking system property javax.xml.bind.context.factory FINE: not found FINE: Checking system property javax.xml.bind.JAXBContext FINE: not found FINE: OSGi environment detected 

我一直在研究这个问题,显然JAXB需要某种属性文件。 现在,我已经构建了更多像这样的REST应用程序,我从来没有必要添加属性文件,它始终有效。

互联网上的一些人认为这是类加载器的问题(就像这里一样),但是,再一次,我从来没有设置过一些类加载器,因为我使用Java EE,这种XML / JSON对象的编组和解组应该自动运行。 此外,超链接中提出的解决方案(添加类加载器XML属性)对我不起作用。

我不明白为什么系统如此不一致。 一些RESTful方法适用于XML和JSON。 其中一些只使用XML,其中一些根本不起作用(在同一个应用程序中!)。

我真的希望有人能帮我找到解决这个问题的方法!

对于那些遇到与我一样的问题,并且无法弄清楚原因的人:我自己找到了解决方案。 我没有完全意识到要序列化为XML / JSON的POJO对象需要具有零参数构造函数。 这包括原始对象中使用的集合。

所以在我的情况下:我的’ProductDetailsView’对象有一个’OnlineCompetitorView’对象列表。 ProductDetailsView和OnlineCompetitorView都需要具有零参数构造函数。 对于一些人来说可能很明显,但我认为分享这些信息是明智的。 我在这个链接的开头发帖中意外地发现了这些信息,所以我想对此给予一些信任。

我有完全相同的问题,但我确实在bean中没有arg构造函数。 对我来说,解决方案是删除bean声明中的generics。 因此,不是返回Bean,而是必须从服务返回Bean。 然后,奇迹般地,一切都奏效了!