0

例如,我将向服务器端发送一个对象 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 的属性序列化为正确的排序。

先谢谢了!

4

1 回答 1

0

在 Axis2 上不确定,但如果您将 CXF 与 JAXB 数据绑定一起使用,则可以添加如下注释:

@XmlType(name = "fruits", propOrder = { "apple", "banana", "pear" }})

到 Fruits 类告诉 JAXB 您需要/希望它们输出什么顺序。

于 2013-04-09T16:58:50.973 回答