HashMap via SOAP from Java to PHP and back

家住魔仙堡 提交于 2019-12-10 07:42:23

问题


i'm facing a little problem and can't find a solution. The situation:

  • I have a Java-Webservice containing different Methods. One of these creates a new Object (named "Bestellung", which is german for "Order"). This object contains some attributes, most of them are Strings, one is a Hashmap named "applikationsDaten" (application data).
  • I'm receiving this object in php via SoapClient - all attributes are filled as i want them. print_r() shows the following (shortened to the relevant parts):
    stdClass Object (
      [enthMWsT] => 0
      [preisStreckeGesamt] => 28.6
      [waehrung] => EUR
      [applikationsDaten] => stdClass Object (
      [entry] => Array (
        [0] => Array ( [key] => test [value] => 1 )
        [1] => Array ( [key] => fahrDrucken [value] => 1 )
        [2] => Array ( [key] => fahrLfdnr [value] => 0 )
      )
    )
  • after manipulation some of the attributes (but not the application data) i'm trying to send that object back to my webservice which should check some things and save the Order to the Database. This is where the problem appears: all attributes are received perfectly, but the application data isn't. When i'm trying to System.out.print() it, i get the following:
[STDOUT] {[key: null]=[value: null], [key: null]=[value: null], [key: null]=[value: null]}

as you can see, it's the number of elements is correct, but all keys an values are null.

my problem is: why don't i get the correct keys/values on java-side?

PS: if you need more information to analyse this, please don't hesitate to ask

EDIT:

on java-side i'm running a jBoss 4.2.2GA

on PHP-side i use the SoapClient Object like this:

$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:


i found the solution: the problem was in my java code. it's not enough to declare the hashmap in the object like this:

private HashMap applikationsDaten;

public HashMap getApplikationsDaten() {
    return applikationsDaten;
}

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

to make it work, i had to specify datatypes for the Hashmap like this:

private HashMap<String,String> applikationsDaten;

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

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

after changing this and redeploying the webservice it worked as expected. I'll leave this question and mark it as community wiki instead of deleting it - maybe it helps someone looking for the same failure.

PS: thanks to ZeissS for his hints.




回答2:


You may also need to this bit of code:

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;
    }


来源:https://stackoverflow.com/questions/3922163/hashmap-via-soap-from-java-to-php-and-back

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!