Domnívám se, že to není problém Tomcatu, ale spíše toho WS frameworku, který vám na něm běží. Podle toho výpisu předpokládám, že to máte asi Apache Axis (new org.apache.axis.description.ElementDesc). Bohužel ho nepoužívám, takže s tím moc asi neporadím.

Ale zkusil bych si z toho serveru stáhnout WSDL té služby, zda vaše oprava na NILLABLE opravdu zabrala a je v definici služby tato hodnota opravdu povolena. Pokud je, tak bych pátral po tom, jak tu hodnotu z klienta posíláte, jestli má správný formát a pokud v tom WSDL/XSD není, tak bych asi zrevidoval ten kód níže, jestli opravdu nastavuje to, co požadujete - jak říkám, Axis neznám a tento kód pro popis rozhraní služby vidím poprvé, já jsem většinou buď psal přímo WSDL/XSD a nebo používal JAXB anotace na třídách.



Dne 17.10.2011 14:44, Ladislav Šorčík napsal(a):
Zdravím všechny.

Zdědil jsem jeden systém komunikující pomocí web services. Jako server je použit Tomcat.

Celá komunikace slouží pro předávání informací mezi 2 systémy zákazníka. Konkrétně se jedná o předávání časů (typ xsi::dateTime). Zpráva může obsahovat několik položek tohoto typu. Od zákazníka vzešel požadavek, aby bylo možné odeslat hodnotu "nil". Ta má rozdílný význam oproti tomu, když hodnota chybí. Upravil jsem tedy příslušnou třídu tak, aby daný element byl "nillable" (viz níže).

static {
    ....

    elemField = new org.apache.axis.description.ElementDesc();
    elemField.setFieldName("eghf");
elemField.setXmlName(new javax.xml.namespace.QName("http://dom.tld/xxx";, "eghf")); elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "dateTime"));
    elemField.setMinOccurs(0);
    elemField.setNillable(true);
    typeDesc.addFieldDesc(elemField);
    elemField = new org.apache.axis.description.ElementDesc();
    elemField.setFieldName("aghf");
elemField.setXmlName(new javax.xml.namespace.QName("http://dom.tld/xxx";, "aghf")); elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "dateTime"));
    elemField.setMinOccurs(0);
    elemField.setNillable(true);
    typeDesc.addFieldDesc(elemField);
    elemField = new org.apache.axis.description.ElementDesc();
    elemField.setFieldName("cghf");
elemField.setXmlName(new javax.xml.namespace.QName("http://dom.tld/xxx";, "cghf")); elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "dateTime"));
    elemField.setMinOccurs(0);
    elemField.setNillable(true);
    typeDesc.addFieldDesc(elemField);
    ...
  }

Bohužel po vyvolání webové služby vrátí web server kód 500 a následující odpověď:

<<< HTTP/1.1 500 Internal Server Error
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>java.lang.NumberFormatException: Invalid date/time</faultstring> <detail><ns1:hostname xmlns:ns1="http://xml.apache.org/axis/";>trlpgw1</ns1:hostname></detail>
</soapenv:Fault></soapenv:Body></soapenv:Envelope>

Bohužel se mi nedaří přesvědčit tomcat, aby vzal na vstupu zprávu s jakoukoliv "nil" hodnotou. Nemáte někdo nějakou smyslupnou radu?

Díky.

LŠ

P.S. Web services jsou pro mne nové, tak mne nekamenujte za případné nepřesnosti v popisu atp.



--
Petr

Odpovedet emailem