HashMap через SOAP от Java до PHP и обратно - PullRequest
4 голосов
/ 13 октября 2010

Я столкнулся с небольшой проблемой и не могу найти решение. Ситуация:

  • У меня есть Java-Webservice, содержащий разные методы. Один из них создает новый Объект (названный «Bestellung», что в переводе с немецкого означает «Порядок»). Этот объект содержит некоторые атрибуты, большинство из которых являются строками, один из них - Hashmap с именем «applikationsDaten» (данные приложения).
  • Я получаю этот объект в php через SoapClient - все атрибуты заполнены так, как я хочу. print_r() показывает следующее (сокращено до соответствующих частей):
    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 )
      )
    )
  • после манипулирования некоторыми атрибутами (но не данными приложения) я пытаюсь отправить этот объект обратно в мой веб-сервис, который должен проверить некоторые вещи и сохранить ордер в базу данных. Вот здесь и возникает проблема: все атрибуты получены отлично, а данные приложения - нет. Когда я пытаюсь System.out.print() это, я получаю следующее:
[STDOUT] {[key: null]=[value: null], [key: null]=[value: null], [key: null]=[value: null]}

Как видите, это число элементов правильное, но все ключи и значения null.

моя проблема: почему я не получаю правильные ключи / значения на стороне java?

PS: если вам нужна дополнительная информация для анализа, пожалуйста, не стесняйтесь спрашивать

EDIT:

на стороне 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;

Ответы [ 2 ]

4 голосов
/ 13 октября 2010

Я нашел решение: проблема была в моем коде 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;
}

после измененияи повторное развертывание веб-службы, она работала, как и ожидалось.Я оставлю этот вопрос и отмечу его как вики сообщества, а не удаляю - может быть, это поможет кому-то искать ту же ошибку.*

0 голосов
/ 22 января 2019

Вам также может понадобиться этот бит кода:

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