我创建了一个Java-AXIs2 webservice,它返回一个java对象(用户定义的类)。我尝试使用此
在coldfusion上访问它<cfset wsObj=createobject("webservice","http://localhost:8080/FFMpegHelperServices/services/TranscodeVideoFileFactoryWS?wsdl")>
当我尝试访问此wsObj并执行某些操作时,我收到以下错误
Cannot perform web service invocation getTranscodeVideoFile. The fault returned when invoking the web service operation is:<br> <pre>AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: org.xml.sax.SAXException: No deserializer for {http://www.w3.org/2001/XMLSchema}anyType faultActor: faultNode: faultDetail: {http://xml.apache.org/axis/}stackTrace:org.xml.sax.SAXException: No deserializer for {http://www.w3.org/2001/XMLSchema}anyType at org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.java:314) at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035) at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165) at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141) at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:236) at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384) at org.apache.axis.client.Call.invoke(Call.java:2448) at org.apache.axis.client.Call.invoke(Call.java:2347) at org.apache.axis.clien... ''</pre> <br>The error occurred on line 34.
任何人都有任何想法来处理这个问题。
webservice类看起来像这样
public class TranscodeVideoFileFactoryWS {
private TranscodeVideoFile[] temp = new TranscodeVideoFile[1];
public String getTranscodeVideoFile() {
return "nasir";
}
}
我想访问正在返回的类。
答案 0 :(得分:2)
您的问题的关键隐藏在错误的这一部分中:
No deserializer for
您尝试使用的Web服务正在使用自定义数据类型; web服务很可能需要参数...或者返回一个值...这是CF不理解的一种变量(比如自定义类)。
不幸的是,要解决此问题,您必须深入了解Web服务的内容,并了解您是否可以在您的最终实现这些自定义类型。
- 编辑 -
根据注释中Java类的描述,初始化时,私有var被实例化:
private TranscodeVideoFile[] temp = new TranscodeVideoFile[1];
虽然与方法调用没有直接关系,但 是作为初始CreateObject()的一部分创建的,因此,我试图在后面的对象调用中以某种身份维护它。不幸的是,该类是自定义的并且对于CF是未知的,并且如果继续沿着这个开发路径继续,则会产生反序列化器错误。
有一个解决方案......但在这种情况下还有一个“正确的事”。
<强>解决方案强>
将编译后的类添加到webservice存根目录手动,这使得ColdFusion可以识别它们,这样当您在Web服务上调用方法时,ColdFusion知道如何处理类,并序列化/适当地反序列化它们。
我在使用Netsuite API时使用this process几个月,信用:Jeremy Gibbens。您还需要对允许临时生成存根的ColdFusion工具进行一些研究 - 该工具是wsdl2java。
Dated article on Wsdl2Java,但仍然相关。
“正确的事”
如果可以,请不要使用SOAP上的自定义类型。如果您可以控制包装FFMpeg Helper对象的代码,并且正在为服务本身做出贡献 - 请不要编写任何处理自定义类的代码。使用ColdFusion理解的类型。