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