例如,我将向服务器端发送一个对象 Fruits。
像这样的代码:
public static <T> T call(String url, String ns, String method, Fruits fruits, Class<T> clz) throws AxisFault
{
RPCServiceClient client = new RPCServiceClient();
Options option = client.getOptions();
EndpointReference erf = new EndpointReference(url);
option.setTo(erf);
QName name = new QName(ns, method);
Object[] object = new Object[]{fruits};
Class[] returnTypes = new Class[]{clz};
Object[] reto = client.invokeBlocking(name, object, returnTypes);
T t = (T)reto[0];
return t;
}
像这样的对象:
public class Fruits implements Serializable
{
private int pear;
private int banana;
private int apple;
public int setPear(int pear){this.pear=pear;}
public int getPear(){return this.pear;}
...
}
xml 部分应该是这样的:
...
<fruits>
<pear>10</pear>
<banana>20</banana>
<apple>60</apple>
</fruits>
...
但实际上是这样的:
...
<fruits>
<apple>60</apple>
<banana>20</banana>
<pear>10</pear>
</fruits>
...
Axis2 使对象的属性按字母顺序排列,但服务器不接受。我无法修改服务器端,它是 ESB。
做成功请求的唯一方法是使用Axis2生成的代码,我以前使用WSDL2Java,但是冗余代码太多,难以维护。所以我想要重构。
我也尝试过使用 CXF,但它也使对象的属性按字母顺序排列,不遵循 WSDL/XSD 或 DTO 定义的样式。
我找到了 CXF 进行排序的原因,它使用 java.beans.BeanInfo 来获取对象的属性,例如:
...
BeanInfo beanInfo = Introspector.getBeanInfo(Fruits.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
...
数组中的属性已经按字母顺序排列。
谁知道如何让 Axis2 将 Fruits 的属性序列化为正确的排序。
先谢谢了!