【问题标题】:HashMap via SOAP from Java to PHP and backHashMap 通过 SOAP 从 Java 到 PHP 并返回
【发布时间】:2010-10-13 09:06:57
【问题描述】:

我遇到了一个小问题,找不到解决方案。情况:

  • 我有一个包含不同方法的 Java-Web 服务。其中之一创建了一个新对象(名为“Bestellung”,在德语中是“Order”的意思)。这个对象包含一些属性,大部分是Strings,一个是名为“applikationsDaten”(应用数据)的Hashmap。
  • 我正在通过 SoapClient 在 php 中接收此对象 - 所有属性都按照我的需要填充。 print_r() 显示以下内容(缩短为相关部分):
标准类对象 ( [enthMWsT] => 0 [preisStreckeGesamt] => 28.6 [waehrung] => 欧元 [应用程序日期] => 标准类对象 ( [入口] => 数组 ( [0] => 数组([键] => 测试 [值] => 1) [1] => 数组([key] => fahrDrucken [value] => 1) [2] => 数组([key] => fahrLfdnr [value] => 0) ) )
  • 在处理了一些属性(但不是应用程序数据)之后,我试图将该对象发送回我的 web 服务,该服务应该检查一些内容并将订单保存到数据库中。这就是问题出现的地方:所有属性都被完美接收,但应用程序数据却不是。当我尝试System.out.print() 它时,我得到以下信息:
[STDOUT] {[key: null]=[value: null], [key: null]=[value: null], [key: null]=[value: null]}

如您所见,元素的个数是正确的,但所有键和值都是null。

我的问题是:为什么我在 java 端没有得到正确的键/值?

PS:如果您需要更多信息来分析这个,请不要犹豫

编辑:

在 java 端,我正在运行 jBoss 4.2.2GA

在 PHP 端,我使用 SoapClient 这样的对象:

$conf['soap_wsdl'] = "http://192.168.0.213:8180/R1WebService/Service?wsdl";
$conf['soap_timeout'] = 5;

$soap = new SoapClient($conf['soap_wsdl'], array('connection_timeout' => $conf['soap_timeout']));

$bst = $soap->getBestellung()->return;

// some stuff

$return = $soap->saveBestellung(array($bst))->return;

【问题讨论】:

  • 1) 您能否提供更多信息,您可以在 php 网站上使用什么来访问 web 服务? 2)能不能用wireshark之​​类的东西或者一些调试工具来查看数据是否正确发送到java webservice?这样你就知道是看 PHP 还是 Java 网站了。

标签: java php web-services soap wiki


【解决方案1】:

我找到了解决方案:问题出在我的 java 代码中。像这样在对象中声明 hashmap 是不够的:

private HashMap applikationsDaten;

public HashMap getApplikationsDaten() {
    return applikationsDaten;
}

public void setApplikationsDaten(HashMap applikationsDaten) {
    this.applikationsDaten = applikationsDaten;
}

为了让它工作,我必须像这样为 Hashmap 指定数据类型:

private HashMap<String,String> applikationsDaten;

public HashMap<String,String> getApplikationsDaten() {
    return applikationsDaten;
}

public void setApplikationsDaten(HashMap<String,String> applikationsDaten) {
    this.applikationsDaten = applikationsDaten;
}

更改此设置并重新部署 Web 服务后,它按预期工作。我会留下这个问题并将其标记为社区 wiki 而不是删除它 - 也许它可以帮助寻找同样失败的人。

PS:感谢 ZeissS 的提示。

【讨论】:

    【解决方案2】:

    你可能还需要这段代码:

    class MapAdapter extends XmlAdapter<MapElements[], Map<String, String>> {
        public MapElements[] marshal(Map<String, String> arg0) throws Exception {
            MapElements[] mapElements = new MapElements[arg0.size()];
            int i = 0;
            for (Map.Entry<String, String> team : arg0.entrySet())
                mapElements[i++] = new MapElements(team.getKey(), team.getValue());
    
            return mapElements;
        }
    
        public Map<String, String> unmarshal(MapElements[] arg0) throws Exception {
            Map<String, String> r = new HashMap<String, String>();
            for (MapElements mapelement : arg0)
                r.put(mapelement.Kryptonim, mapelement.Status);
            return r;
        }
    

    【讨论】:

      猜你喜欢
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 2014-03-15
      • 2011-11-28
      • 2020-05-23
      • 2016-02-29
      相关资源
      最近更新 更多