Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson JSON生成HTTP状态500,XML工作_Java_Xml_Json_Jaxb_Jackson - Fatal编程技术网

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

Java Jackson JSON生成HTTP状态500,XML工作,java,xml,json,jaxb,jackson,Java,Xml,Json,Jaxb,Jackson,我目前正在使用Jackson将Java对象序列化为JSON和XML,作为REST Web服务的响应。我有以下带注释的Java对象: @XmlRootElement(name = "Product") @XmlAccessorType(XmlAccessType.FIELD) public class ProductDetailsView { @XmlElement private int id; @XmlElement private long EAN; @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<OnlineCompetitorView> onlineCompetitors;
我也尝试将@XmlRootElement注释添加到OnlineCompetitorView中,但这并没有改变任何事情。由于我没有从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;
}
那么,当JSON创建内部服务器错误时,XML如何能够正常工作呢? 有人能帮我解决这个问题吗?非常感谢您的帮助


编辑

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

我创建了一个小而简单的测试,它返回一个非常简单的带注释的POJO,它既不能使用XML也不能使用JSON(而更复杂的“产品”——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应用程序,我从来没有添加过属性文件或其他任何东西,而且一直都很有效

互联网上的一些人认为类加载器(比如)有问题,但我再次强调,我从来没有设置过一些类加载器,因为我使用JavaEE,XML/JSON对象的编组和解编组应该自动工作。此外,超链接中提出的解决方案(添加class loader XML属性)对我来说也不起作用

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


我真的希望任何人都能帮我找到解决这个问题的办法

对于那些和我有同样问题的人,我自己也找到了解决办法。我没有完全意识到,要序列化为XML/JSON的POJO对象需要一个零参数构造函数。其中包括原始对象中使用的集合


所以在我的例子中:我的“ProductDetailsView”对象有一个“OnlineCompetitorView”对象列表。ProductDetailsView和OnlineCompetitorView都需要一个零参数构造函数。对一些人来说,这可能是显而易见的,但我认为分享这些信息是明智的。我在这篇文章的开头偶然发现了这个信息,所以我想对此给予一些赞扬。

我遇到了完全相同的问题,但我在bean中没有arg构造函数。对我来说,解决方案是删除bean声明中的泛型。因此,我没有返回Bean,而是从服务返回Bean。然后,奇迹般地,一切都成功了

您是否检查了服务器日志以查看可能的错误?是的,我检查了。不幸的是,Glassfish在我调用REST服务时没有记录任何事件。这就是问题如此难以解决的原因。您使用的是哪个
JAX-RS
实现,我想说
JAXB
在这里是错误的工具,我通常使用Jackson插件来实现,只使用Jackson
JSON
注释,xml注释有冲突,就我所知,Jersey是使用JavaEE时JAX-RS的默认实现。我从未添加过其他实现,导入都来自javax.ws.rs。使用GET和Path注释的方法应该自动将返回的POJO打包为XML或JSON,对吗?(取决于内容类型)不管怎样,它总是像我这样工作……我的resource方法返回一个将作为XML流传输的POJO时遇到了同样的500错误。花大约30分钟的时间试图找出问题的原因,因为JAXB pojo非常直截了当。你的评论挽救了这一天。我显然为其他类添加了一个参数化构造函数,以便一步初始化pojo。谢谢。并进行投票表决。
@GET
@Path("/get/product/{ean}")
@Produces({"application/xml", "application/json"})
public ProductDetailsView getProduct(@PathParam("ean") Long EAN) {
    ProductDetailsView pdv = service.getProductDetailsView(EAN);
    return pdv;
}
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