繁体   English   中英

如何在Java Web Service客户端中的编组输出中进行更改

[英]How to make changes in marshalled output in Java web service client

我正在尝试与第三方Web服务进行交互,后者要求我发送安全令牌作为每个请求的一部分。 令牌本身就是一个节点,我是从初始调用的响应中获取的。 Web服务端点是dotNet,我有一个Java客户端。

显然,服务器端希望我发送的安全令牌与提供给我的完全相同:字面上相同的字符串:因此,如果其内容的大小,顺序等不同,则不会执行。

因此,在SoapUI中,一切正常。 初始“ startSession”调用的响应中有一个令牌,我将其复制到下一个调用的请求中。

但是在Java中(我尝试过JAX-WS和CXF生成的代码,都依赖JAXB),它不起作用。 将令牌解组后,我将其作为对象接收,并在下一次调用中使用此对象。 封送发送时,它在子节点中缺少名称空间属性。 服务器端表示不会继续,因为令牌不正确。 因此,通过使用JAXB出站逻辑处理程序功能,我能够添加缺少的名称空间,而在DOM源中没有任何问题(我也能够使用CXF拦截器实现此目的)。

现在的问题是,在对属性进行编组后,其排序方式应使结果仍不与所提供的令牌解组之前的令牌匹配。 尽管没关系,但这些属性的顺序至关重要。

我不知道如何解决这个问题,除非可以实际修改输出XML字符串。 我什至尝试了一个肮脏的技巧,方法是从子节点中删除所有属性,并用一个看起来相同的属性替换它们。 但是外面的两个双引号变成了单引号...

我希望任何人都有一个主意。 因为我什么都没有。

干杯。

更新:我应该提到有问题的属性是命名空间(d)属性。 该节点应如下所示:

<HawanedoSessionInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.thecompany.com/Hawanedo/Business/v2.0c">

但是,在使用出站JAXB处理程序添加缺少的xmlns =“ ...”之后,我的结果如下所示:

<HawanedoSessionInfo xmlns="http://schemas.thecompany.com/Hawanedo/Business/v2.0c" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

在HawanedoSessionInfo类中,我像这样使用XmlType.proporder和@XmlAttribute:

@XmlType(name = "HawanedoSessionInfo", propOrder = {
"xsd",
"xsi",
"xmlns", 

以及其他一些非属性子元素。

    private String xsd;
private String xsi;
private String xmlns;

    @XmlAttribute(ns="http://schemas.thecompany.com/Hawanedo/Business/v2.0c")
public String getXsd() {
    return xsd;
}

public void setXsd(final String xsd) {

    this.xsd = xsd;
}

@XmlAttribute(ns="http://schemas.thecompany.com/Hawanedo/Business/v2.0c")
public String getXsi() {
    return xsi;
}

public void setXsi(final String xsi) {

    this.xsi = xsi;
}

@XmlAttribute
public String getXmlns() {
    return xmlns;
}

public void setXmlns(final String xmlns) {

    this.xmlns = xmlns;
}

所以很明显,proporder选项在这种情况下无济于事?

更新2:

就像我在回答中写的那样,它现在可以工作了。 基于此LINK ,在HawanedoSessionInfo类中添加了:

@XmlCustomizer(HawanedoSessionInfoCustomizer.class)

我完全按照链接页面中的描述创建了定制程序类,并添加了jaxb.properties。

所以我做了两件事:

1)我将属性添加到了propOrder属性(已存在的顶部)中。 我将属性添加为实例变量,并创建了getter / setter。 我用XmlAttribute注释了吸气剂。

2)我实现了XmlCustomizer解决方案。

现在来了奇怪的部分。 根据Fiddler,属性的顺序仍然没有改变! 但我必须强调,只有在实现定制程序之后,这现在才起作用。 这是怎么回事 :)

因此,原则上您不能以标准方式控制属性的顺序,但是....

  1. 取决于jaxb / java版本,可以通过名称的字母顺序(声明顺序)确定顺序。 如果a)移动字段会改变任何东西,b)重命名字段(XMLAttribute必须映射到原始名称),则可以尝试编写代码。

如果幸运的话,它会起作用。 但是,当然,这是一个hack,可以一直工作到下一个jaxb / java更新。

  1. JAXB提供程序(实际的实现可以具有其他功能),可用于自定义编组过程。 例如,我发现: https ://community.oracle.com/thread/977397紧靠eclipselink。

  2. 我敢肯定,有一种方法可以在发送之前将其截取,或者在发送之前控制数据序列化。 我可以考虑如何称呼它,但是尝试使用jaxws客户端自定义进行谷歌搜索。 如果捕获整个肥皂消息,则简单的xslt转换可以修复属性顺序。

我感到你很痛苦。 使用xml,jaxws等的全部要点是使我们的生活更轻松,然后某些提供程序决定不遵循标准,结果您会陷入混乱,而这几天您都试图进行清理。 祝您好运,也许尝试从Eclipse Moxy联系xml专家

我现在很高兴,因为我能正常工作,而且花了整整一个星期的时间... :)在@Zielu的帮助下,我指出了Blaise Doughan建议的EclipseLink XMLCustomizer解决方案的链接: XMLCustomizer解决方案

我将代码放入原始问题中(在“ UPDATE”下),并按建议添加了确切的解决方案。 不知道这是否全部必要,但可以。 多谢你们。

您有可能可以通过使用以下命令控制订单,

@XmlType (propOrder={"prop1","prop2",..."propN"})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM