我尝试编写一个Web服务方法,该方法将一个对象作为其参数之一,并且该对象具有另一个对象类型的属性。只要所有对象属性都是基本类型,传入对象似乎没有问题。只要其中一个属性是另一个对象,即使该嵌入对象由所有基元组成,它也会出现问题。
我使用SoapUI来测试它,我得到的错误是org.xml.sax.SAXException:没有{http://WebService的反序列化器} MyEmbeddedObject
我认为必须有一种简单的方法来告诉它对嵌入式对象进行反序列化,但不能为我的生活找出方法。在这一点上,我也会采取艰难的方式,我只需要一个解决方案,我可以随时尝试改进它。
我写的网络服务中的方法如下:
public boolean MethodName(MyObject object, String sessionID) throws Exception
{
//do Stuff
}
MyObject类看起来像这样:
public class MyObject implements java.io.Serializable
{
public String Description;
public MyEmbeddedObject Thing1;
public MyEmbeddedObject Thing2;
public MyEmbeddedObject[] Things;
}
MyEmbeddedObject类如下所示:
public class MyEmbeddedObject implements java.io.Serializable
{
public String SubThing1;
public String SubThing2;
public String SubThing3;
}
答案 0 :(得分:0)
在我的情况下,这个问题与实现java.io.Serializable无关。事实上你可以删除它,只要你解决了实际问题它就会正常工作。
实际的问题是你不能使用一个对象作为参数,除非它的所有属性都是原始类型,除非你在方法本身中也使用了这个embeded对象。如果你问我,它似乎是某种编译器伏都教,但这里是代码中的解决方案。希望这是有道理的。为了便于说明,我甚至会把它深一层。
有一件事你会注意到我在解决方案中发生的变化是" MyEmbeddedObject"上课看起来要复杂得多。这是因为在我提出这个问题的时候,我还不知道如何在java中正确定义数组。我认为它和C#一样,不幸的是,这使我的问题复杂化了,但我最终通过敲打我的脑袋并查看该项目所针对的供应商的示例代码来解决这个问题。
程序
public boolean MethodName(MyObject object, String sessionID)
{
//do Stuff
}
public MyEmbeddedObject unusedMyEmbeddedObject()
{
return null;
}
public MyDoubleEmbeddedObject unusedMyDoubleEmbeddedObject()
{
return null;
}
在单独的类文件中
public class MyObject
{
public String description;
public MyEmbeddedObject thing1;
public MyEmbeddedObject thing2;
}
在单独的类文件中
public class MyEmbeddedObject
{
public MyDoubleEmbeddedObject subThing1;
private MyDoubleEmbeddedObject[] subThings;
public MyDoubleEmbeddedObject[] getSubThings()
{
return this.subThings;
}
public void setSubThings(final MyDoubleEmbeddedObject[] value)
{
this.subThings = value;
}
}
在单独的类文件中
public class MyDoubleEmbeddedObject
{
public String subSubString1;
public String subSubString2;
public String subSubString3;
}