使用Eclipse我从WSDL文件创建了一个Web服务客户端。一切都很好,因为我可以实例化我的服务调用Java对象并设置必需的字段。
我的问题是,在进行服务调用之前,我无法找到提取请求XML的方法。我需要看到针对Web服务生成的请求XML。任何帮助赞赏。
这是我自动生成的服务调用对象:
public class ClientPrice implements java.io.Serializable {
private java.lang.String clientKey;
// Type metadata
private static org.apache.axis.description.TypeDesc typeDesc =
new org.apache.axis.description.TypeDesc(MedicareReprice.class, true);
static {
typeDesc.setXmlType(new javax.xml.namespace.QName("http://services.com", "MedicareReprice"));
org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
elemField.setFieldName("clientKey");
elemField.setXmlName(new javax.xml.namespace.QName("http://services.com", "ClientKey"));
elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
elemField.setNillable(false);
typeDesc.addFieldDesc(elemField);
typeDesc.addFieldDesc(elemField);
}
/**
* Return type metadata object
*/
public static org.apache.axis.description.TypeDesc getTypeDesc() {
return typeDesc;
}
/**
* Get Custom Serializer
*/
public static org.apache.axis.encoding.Serializer getSerializer(
java.lang.String mechType,
java.lang.Class _javaType,
javax.xml.namespace.QName _xmlType) {
return
new org.apache.axis.encoding.ser.BeanSerializer(
_javaType, _xmlType, typeDesc);
}
/**
* Get Custom Deserializer
*/
public static org.apache.axis.encoding.Deserializer getDeserializer(
java.lang.String mechType,
java.lang.Class _javaType,
javax.xml.namespace.QName _xmlType) {
return
new org.apache.axis.encoding.ser.BeanDeserializer(
_javaType, _xmlType, typeDesc);
}
}
这是我对Web服务进行实际调用的方式,但我需要在调用Web服务之前提取请求XML。我尝试使用TypeDesc对象但不返回XML。
ClientPrice price = new ClientPrice();
price.setClientKey("12345");
ProcessingLocator serviceLocator = new ProcessingLocator();
IProcessing service = serviceLocator.getSecureSoap11();
//Help here. How can I extract XML before invoking web serice????
Results results = service.invokeWebService(price);
提前致谢。
迟到总比没有好,我有完全相同的问题,这就是我弄清楚的。
public static String serializeAxisObject(final Object obj, final boolean removeNamespaces, final boolean prettyPrint)
{
final StringWriter outStr = new StringWriter();
final TypeDesc typeDesc = getAxisTypeDesc(obj);
QName qname = typeDesc.getXmlType();
String lname = qname.getLocalPart();
lname = lname.substring(1);
qname = removeNamespaces ? new QName(lname) : new QName(qname.getNamespaceURI(), lname);
final AxisServer server = new AxisServer();
final BeanSerializer ser = new BeanSerializer(obj.getClass(), qname, typeDesc);
final SerializationContext ctx = new SerializationContext(outStr, new MessageContext(server));
ctx.setSendDecl(false);
ctx.setDoMultiRefs(false);
ctx.setPretty(prettyPrint);
try
{
ser.serialize(qname, new AttributesImpl(), obj, ctx);
} catch (final Exception e) {
//throw new Exception(“Unable to serialize object ” + obj.getClass().getName(), e);
e.printStackTrace();
}
String xml = outStr.toString();
if (removeNamespaces)
{
// remove any namespace attributes
xml = xml.replaceAll(" xmlns[:=].*?\".*?\"", "")
.replaceAll(" xsi:type=\".*?\"", "");
}
return(xml);
}
public static TypeDesc getAxisTypeDesc(final Object obj)
{
try
{
final Class objClass = obj.getClass();
final Method methodGetTypeDesc = objClass.getMethod("getTypeDesc", new Class[] {});
final TypeDesc typeDesc = (TypeDesc) methodGetTypeDesc.invoke(obj, new Object[] {});
return(typeDesc);
}
catch (final Exception e)
{
e.printStackTrace();
}
return null;
}
如何使用它
serializeAxisObject(new ClientPrice(), false, false);
我希望有所帮助