PDA

View Full Version : JDOM / XML Problem



Seiten : [1] 2

Drittaccount
16-04-08, 14:58
Hallo zusammen,

ich habe ein Problem im Bereich XML Generierung. Kurzer Sachverhalt:

Eine Internetseite schickt eine Anfrage per XML an uns. Diese wird zunächst von einem JAVA Programm, welches sich auf einem Linuxserver (verwendet tomcat) in der DMZ befindet, bearbeitet und dann über eine .pcml an ein RPG Programm übergeben. Dieses Programm liefert dann wieder eine XML als Antwort welche dann an den Sender zurückgeschickt wird.

meine erste Vermutung:
irgendwas stimmt hier nicht ... :)

mein Problem:
Das Javaprogramm bringt seit ein paar Tagen nur noch einen Timeout zurück.
Am Programm selbst wurde aber anscheinend nichts geändert.

Da das Programm nicht von mir ist und ich hier kaum Java programmiere fällt es mir jetzt nicht ganz einfach den Fehler zu finden. Folgendes konnte ich schon testen:

Das Programm bekommt Daten zugeschickt,

(req.getContentLength() ist größer -1)

kann aber folgeden Zeile nicht ausführen:

InputStream iStream = req.getInputStream();




protected void getXMLRequest(HttpServletRequest req) throws IOException,
JDOMException {

if (req.getContentLength() == -1) {
log("contentlänge == -1");
return;
} else {
DOMBuilder builder = new DOMBuilder(true);
InputStream iStream = req.getInputStream();

XMLRequest = builder.build(iStream);
iStream.close();

return;
}
}
auf der Linuxconsole bekomme ich folgende Fehlermeldung:



org.jdom.JDOMException: Error on line 2: org.apache.crimson.parser/P-082 http://www.....de/shop/dtd/...dtd
at org.jdom.input.DOMBuilder.build(DOMBuilder.java:27 4)
at Lieferterminanfrage.getXMLRequest(Lieferterminanfr age.java:52)
at Lieferterminanfrage.service(Lieferterminanfrage.ja va:92)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:853)
at org.apache.tomcat.core.ServletWrapper.handleReques t(ServletWrapper.java:503)
at org.apache.tomcat.core.ServletWrapper.handleReques t(ServletWrapper.java:597)
at org.apache.tomcat.servlets.InvokerServlet.service( InvokerServlet.java:257)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:853)
at org.apache.tomcat.core.ServletWrapper.handleReques t(ServletWrapper.java:503)
at org.apache.tomcat.core.ContextManager.service(Cont extManager.java:559)
at org.apache.tomcat.service.http.HttpConnectionHandl er.processConnection(HttpConnectionHandler.java:16 0)
at org.apache.tomcat.service.TcpConnectionThread.run( SimpleTcpEndpoint.java:338)
at java.lang.Thread.run(Thread.java:484)

Root cause: java.net.NoRouteToHostException: Die Wartezeit für die Verbindung ist abgelaufen
at org.apache.crimson.parser.Parser2.fatal(Parser2.ja va:3035)
at org.apache.crimson.parser.Parser2.externalParamete rEntity(Parser2.java:2723)
at org.apache.crimson.parser.Parser2.maybeDoctypeDecl (Parser2.java:1154)
at org.apache.crimson.parser.Parser2.parseInternal(Pa rser2.java:488)
at org.apache.crimson.parser.Parser2.parse(Parser2.ja va:304)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLR eaderImpl.java:433)
at org.apache.crimson.jaxp.DocumentBuilderImpl.parse( DocumentBuilderImpl.java:179)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBu ilder.java:86)
at java.lang.reflect.Method.invoke(Native Method)
at org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPD OMAdapter.java:146)
at org.jdom.input.DOMBuilder.build(DOMBuilder.java:23 0)
at Lieferterminanfrage.getXMLRequest(Lieferterminanfr age.java:52)
at Lieferterminanfrage.service(Lieferterminanfrage.ja va:92)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:853)
at org.apache.tomcat.core.ServletWrapper.handleReques t(ServletWrapper.java:503)
at org.apache.tomcat.core.ServletWrapper.handleReques t(ServletWrapper.java:597)
at org.apache.tomcat.servlets.InvokerServlet.service( InvokerServlet.java:257)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:853)
at org.apache.tomcat.core.ServletWrapper.handleReques t(ServletWrapper.java:503)
at org.apache.tomcat.core.ContextManager.service(Cont extManager.java:559)
at org.apache.tomcat.service.http.HttpConnectionHandl er.processConnection(HttpConnectionHandler.java:16 0)
at org.apache.tomcat.service.TcpConnectionThread.run( SimpleTcpEndpoint.java:338)
at java.lang.Thread.run(Thread.java:484)
mit dieser Meldung kann ich halt leider nicht viel anfangen ... kann mir hier vielleicht jmd. helfen?

Wie kann es zu so einem Fehler kommen?
Wurde der tomcat vielleicht falsch gestartet?
Fehlen vielleicht die Zusatzklassen jdom.jar, servlet.jar ... ?
Muss man hier etwas beim Kompilieren beachten? -> Ort der Zusatzklassen lokal und auf dem Server?

Bin um jeden Tip dankbar ...

Fuerchau
16-04-08, 17:26
So wie die Fehlermeldung aussieht (das ist die Erste), kann der Parser das XML-Dokument nicht verarbeiten, da es der zugeordneten DTD nicht entspricht.

Der Fehler scheint aber nicht abgefangen zu werden, so dass das Java-Programm eben stirbt.

RobertPic
17-04-08, 15:30
Ich denke, dass die falsche XML-Validierung ein Folgefehler ist.

Der vorangegangene Fehler java.net.NoRouteToHostException:

mit Zeitüberlauf weißt auf ein Netzwerkproblem hin.

Normalerweise hat man dieses Problem bei Socketkommunikation, wenn das System keinen Rückkanal aufbauen kann.

Auf einem Webserver wundert mich das zwar, aber wer weiß.

1.) Kannst auch eine Anfrage auch innerhalb der DMZ stellen?

2.) Kannst du an den Javaprogrammen was ändern?

3.) Außerdem habe ich etwas Zweifel an der Fehlerzeile "InputStream iStream ...".
Der Stacktrace zeigt JDOM-Programme, in dieser Zeile sind nur Java.io.* und das Servlet - nocheinmal prüfen!

/Robert

Drittaccount
18-04-08, 14:39
@RobertPic:

zu Punk1:
Wäre denke ich möglich, aber mit viel Aufwand.

zu Punkt 2:
die Quellen liegen vor. Ich kann also den Code ändern.

zu Punkt 3:

ich habe folgendes getestet:



if (req.getContentLength() == -1) {
log("contentlänge == -1");
return;
} else {

DOMBuilder builder = new DOMBuilder(true);
log("DOMBuilder builder = new DOMBuilder(true);");

InputStream iStream = req.getInputStream();
log("InputStream iStream = req.getInputStream();");

XMLRequest = builder.build(iStream);
log("XMLRequest = builder.build(iStream);");

iStream.close();
log("iStream.close();");

return;
}
wenn er also eine Logzeile schreibt hat er auch den Befehl ausgeführt ...

XMLRequest = builder.build(iStream); wird leider nicht ausgeführt.

RobertPic
18-04-08, 17:03
Hallo

Baue Folgendes nach dem InputStream =... (bzw. log) ein:


StringBuffer xml = new StringBuffer();
byte[] b = new byte[4096];
for (int n; (n = iStream.read(b)) != -1;) {
xml.append(new String(b, 0, n));
}
ByteArrayInputStream xmlStream = new ByteArrayInputStream(xml.toString().getBytes());da nach noch ein
log("XML-Inhalt: " + xml);

und dahinter musst du den build(iStream) durch build(xmlStream) ersetzen.

Wenn es keine Netzwerkproblem ist, solltest du die Anfrage im Log haben und weiterforschen können. Wenn er jetzt in der Schleife verstirbt, ist es zu 99,9% kein XML-Problem.

Der Teil ist nicht besonders sauber geschrieben (beim Hin- und Herwandeln könnten Umlaute verloren gehen), also nach der Problembehebung besser wieder entfernen.

/Robert

Drittaccount
21-04-08, 08:45
@RobertPic:

Vielen Dank für deinen Tip. Im Log kommt jetzt die XML-Anfrage an.
Es scheint also kein Netzwerkproblem zu sein.
Leider funktioniert der XMLRequest = builder.build(xmlStream); aber auch nicht ...

Woran kann das liegen ?

Drittaccount
21-04-08, 09:01
@Fuerchau:


So wie die Fehlermeldung aussieht (das ist die Erste), kann der Parser das XML-Dokument nicht verarbeiten, da es der zugeordneten DTD nicht entspricht.Möglicherweise stimmt ja hier was nicht ... ich finde zwar keinen Fehler, aber vielleicht übersehe ich ja etwas.

Also im Log kommt folgendes an:



<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE LieferterminanfrageKopf SYSTEM "http://www.shk-branchenportal.de/shop/dtd/LieferterminanfrageKopf.dtd">
<LieferterminanfrageKopf>
<Message id="0000000112435" sender="1331" receiver="121" passwd="test"/>
<Auftragsdaten>
<kndnr>001100</kndnr>
<ordernr>A00XXXXXXX</ordernr>
<ghbnr></ghbnr>
<datumvon></datumvon>
<datumbis></datumbis>
</Auftragsdaten>
</LieferterminanfrageKopf>
Und die Layoutdatei:
http://www.shk-branchenportal.de/shop/dtd/LieferterminanfrageKopf.dtd (http://www.shk-branchenportal.de/shop/dtd/LieferterminanfrageKopf.dtd:)



<!ELEMENT LieferterminanfrageKopf (Message, Auftragsdaten)>
<!ELEMENT Message EMPTY>
<!ATTLIST Message
id CDATA #REQUIRED
sender CDATA #REQUIRED
receiver CDATA #REQUIRED
passwd CDATA #IMPLIED>

<!ELEMENT Auftragsdaten (kndnr, ordernr?, ghbnr?, datumvon?, datumbis?)>
<!ELEMENT kndnr (#PCDATA)>
<!ELEMENT ordernr (#PCDATA)>
<!ELEMENT ghbnr (#PCDATA)>
<!ELEMENT datumvon (#PCDATA)>
<!ELEMENT datumbis (#PCDATA)>

RobertPic
21-04-08, 11:26
Kommt jetzt immer noch die Exception vom 1. Posting?

Wenn ja, tippe ich darauf, dass er beim Versuch das DTD-File zu lesen (über http) nicht ins Internet kommt.

/Robert

Drittaccount
21-04-08, 12:15
@RobertPic:

du meinst warscheinlich diese hier:
( -> also doch ein Netzwerkproblem ?!)

dann werd ich wohl einen unserer Netzwerkspezialisten aufsuchen müssen ...

Vielen Dank nochmals für die Unterstützung.


org.jdom.JDOMException: Error on line 2: org.apache.crimson.parser/P-082 http://www.shk-branchenportal.de/shop/dtd/LieferterminanfrageKopf.dtd
at org.jdom.input.DOMBuilder.build(DOMBuilder.java:27 4)
at Lieferterminanfrage.getXMLRequest(Lieferterminanfr age.java:72)
at Lieferterminanfrage.service(Lieferterminanfrage.ja va:121)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:853)
at org.apache.tomcat.core.ServletWrapper.handleReques t(ServletWrapper.java:503)
at org.apache.tomcat.core.ServletWrapper.handleReques t(ServletWrapper.java:597)
at org.apache.tomcat.servlets.InvokerServlet.service( InvokerServlet.java:257)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:853)
at org.apache.tomcat.core.ServletWrapper.handleReques t(ServletWrapper.java:503)
at org.apache.tomcat.core.ContextManager.service(Cont extManager.java:559)
at org.apache.tomcat.service.http.HttpConnectionHandl er.processConnection(HttpConnectionHandler.java:16 0)
at org.apache.tomcat.service.TcpConnectionThread.run( SimpleTcpEndpoint.java:338)
at java.lang.Thread.run(Thread.java:484)

Root cause: java.net.NoRouteToHostException: Die Wartezeit für die Verbindung ist abgelaufen
at org.apache.crimson.parser.Parser2.fatal(Parser2.ja va:3035)
at org.apache.crimson.parser.Parser2.externalParamete rEntity(Parser2.java:2723)
at org.apache.crimson.parser.Parser2.maybeDoctypeDecl (Parser2.java:1154)
at org.apache.crimson.parser.Parser2.parseInternal(Pa rser2.java:488)
at org.apache.crimson.parser.Parser2.parse(Parser2.ja va:304)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLR eaderImpl.java:433)
at org.apache.crimson.jaxp.DocumentBuilderImpl.parse( DocumentBuilderImpl.java:179)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBu ilder.java:86)
at java.lang.reflect.Method.invoke(Native Method)
at org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPD OMAdapter.java:146)
at org.jdom.input.DOMBuilder.build(DOMBuilder.java:23 0)
at Lieferterminanfrage.getXMLRequest(Lieferterminanfr age.java:72)
at Lieferterminanfrage.service(Lieferterminanfrage.ja va:121)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:853)
at org.apache.tomcat.core.ServletWrapper.handleReques t(ServletWrapper.java:503)
at org.apache.tomcat.core.ServletWrapper.handleReques t(ServletWrapper.java:597)
at org.apache.tomcat.servlets.InvokerServlet.service( InvokerServlet.java:257)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:853)
at org.apache.tomcat.core.ServletWrapper.handleReques t(ServletWrapper.java:503)
at org.apache.tomcat.core.ContextManager.service(Cont extManager.java:559)
at org.apache.tomcat.service.http.HttpConnectionHandl er.processConnection(HttpConnectionHandler.java:16 0)
at org.apache.tomcat.service.TcpConnectionThread.run( SimpleTcpEndpoint.java:338)
at java.lang.Thread.run(Thread.java:484)

RobertPic
21-04-08, 13:00
Du kannst den Fehler noch weiter einschränken, führe auf dem Linuxserver folgendes Befehle aus:

1.) Kann die Adresse als IP umgesetzt werden? Anm. Das Webserver nicht auf Pings antworten, ist normal. Es geht darum, ob der Name aufgelöst werden kann.


ping www.shk-branchenportal.de


2.) Download der Datei

wget http://www.shk-branchenportal.de/shop/dtd/LieferterminanfrageKopf.dtd


Linuxbefehl zum Downloaden einer html-Seite. Liefert vielleicht noch genauere Fehler.

/Robert