Hallo Java-Gemeinde,
nachdem ich mit einer Quick&Dirty Version gescheitert bin das alte JAXM-Paket mit Java 1.6 kompatibel zu machen (Namespace-Problem-etc), habe ich mich von diesem Komplettpaket gelöst und verwende nur noch SOAP.
D.h ich habe mich von der Implementierung mit Hilfe von JAXM (veraltet und eigentlich nicht benötigt) getrennt und verwende kein externes Paket mehr (SOAP seit Java 1.6 enthalten).
Ziel ist es im Prinzip lediglich XML (->SOAP) über HTTP zu übertragen.
Meine Implementierung steht, allerdings erhalte ich folgenden internen Fehler beim Verbindungsaufbau:
09.05.2008 14:10:31 com.sun.xml.internal.messaging.saaj.soap.MessageImpl identifyContentType
SCHWERWIEGEND: SAAJ0537: Invalid Content-Type. Could be an error message instead of a SOAP message
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Invalid Content-Type:text/html. Is this an error message instead of a SOAP response?
at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.identifyContentType(MessageImpl.java:605)
at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.<init>(MessageImpl.java:278)
at com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl.<init>(Message1_1Impl.java:68)
at com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl.createMessage(SOAPMessageFactory1_1Impl.java:62)
at de.mynamespace.MyHttpSOAPConnection.call(ColHttpSOAPConnection.java:116)
Implementierung:
Client: Gültige und existierende SOAPMessage wird über eine SOAPConnection verschickt. Dabei habe ich sowohl
als auch statt der Factory eine eigene Connection-Klasse (Implementierung wie JAXM-Klasse HttpSOAPConnection) versucht. (Beides liefert den gleichen Fehler).
Als Servlet habe ich von HttpServlet abgeleitet. Und folgenden Code aus der JAXM-Implementierung (JAXMServlet) in dieser Klasse übernommen:
Zusätzlich natürlich onMessage() nach meinen Wünchen implementiert.
Kann mir hier bitte jemand weiterhelfen? Woran liegt das Problem bzw. wie kann ich es Lösen? Gibt es alternativen (ohne komplexe Web-Services pakete) XML über HTTP zu verschicken?[/code]
nachdem ich mit einer Quick&Dirty Version gescheitert bin das alte JAXM-Paket mit Java 1.6 kompatibel zu machen (Namespace-Problem-etc), habe ich mich von diesem Komplettpaket gelöst und verwende nur noch SOAP.
D.h ich habe mich von der Implementierung mit Hilfe von JAXM (veraltet und eigentlich nicht benötigt) getrennt und verwende kein externes Paket mehr (SOAP seit Java 1.6 enthalten).
Ziel ist es im Prinzip lediglich XML (->SOAP) über HTTP zu übertragen.
Meine Implementierung steht, allerdings erhalte ich folgenden internen Fehler beim Verbindungsaufbau:
09.05.2008 14:10:31 com.sun.xml.internal.messaging.saaj.soap.MessageImpl identifyContentType
SCHWERWIEGEND: SAAJ0537: Invalid Content-Type. Could be an error message instead of a SOAP message
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Invalid Content-Type:text/html. Is this an error message instead of a SOAP response?
at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.identifyContentType(MessageImpl.java:605)
at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.<init>(MessageImpl.java:278)
at com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl.<init>(Message1_1Impl.java:68)
at com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl.createMessage(SOAPMessageFactory1_1Impl.java:62)
at de.mynamespace.MyHttpSOAPConnection.call(ColHttpSOAPConnection.java:116)
Implementierung:
Client: Gültige und existierende SOAPMessage wird über eine SOAPConnection verschickt. Dabei habe ich sowohl
Code:
SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance();
SOAPConnection con = factory.createConnection();
SOAPMessage reply = con.call(message, sUriEndPoint);
als auch statt der Factory eine eigene Connection-Klasse (Implementierung wie JAXM-Klasse HttpSOAPConnection) versucht. (Beides liefert den gleichen Fehler).
Als Servlet habe ich von HttpServlet abgeleitet. Und folgenden Code aus der JAXM-Implementierung (JAXMServlet) in dieser Klasse übernommen:
Code:
private static MessageFactory msgFactory = null;
private String fname = null;
/**
* Initialisiert das Servlet
* @param servletConfig Konfigurationsdaten des Servlets
* @exception ServletException wird geworfen, wenn kein InitialContext gefunden wurde
*/
public void init(ServletConfig servletConfig) throws ServletException {
if (log.isDebugEnabled()) log.debug("Initialisierung eines neuen Listeners.");
super.init(servletConfig);
try {
this.ctx = new InitialContext();
} catch (NamingException ex) {
log.error("Der InitialContext konnte nicht erstellt werden.");
throw new ServletException("Der InitialContext konnte nicht erstellt werden.");
}
try {
msgFactory = MessageFactory.newInstance();
} catch (SOAPException ex) {
throw new ServletException("Unable to create message factory"+ ex.getMessage());
}
}
/**
* Internalizes the given <code>HttpServletRequest</code> object
* and writes the reply to the given <code>HttpServletResponse</code>
* object.
*
* Note that the value for the <code>msgFactory</code> field will be used to
* internalize the message. This ensures that the message
* factory for the correct profile is used.
*
* @param req the <code>HttpServletRequest</code> object containing the
* message that was sent to the servlet
* @param resp the <code>HttpServletResponse</code> object to which the
* response to the message will be written
* @throws ServletException if there is a servlet error
* @throws IOException if there is an input or output error
*/
public void doPost(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException
{
try {
// Get all the headers from the HTTP request.
MimeHeaders headers = getHeaders(req);
// Get the body of the HTTP request.
InputStream is = req.getInputStream();
// Now internalize the contents of a HTTP request and
// create a SOAPMessage
SOAPMessage msg = msgFactory.createMessage(headers, is);
SOAPMessage reply = null;
reply = onMessage(msg);
if (reply != null) {
// Need to saveChanges 'cos we're going to use the
// MimeHeaders to set HTTP response information. These
// MimeHeaders are generated as part of the save.
if (reply.saveRequired()) {
reply.saveChanges();
}
resp.setStatus(HttpServletResponse.SC_OK);
putHeaders(reply.getMimeHeaders(), resp);
// Write out the message on the response stream.
OutputStream os = resp.getOutputStream();
reply.writeTo(os);
os.flush();
} else
resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
}
catch(Exception ex) {
throw new ServletException("JAXM POST failed "+ex.getMessage());
}
}
/**
* Returns a <code>MimeHeaders</code> object that contains the headers
* in the given <code>HttpServletRequest</code> object.
*
* @param req the <code>HttpServletRequest</code> object that a
* messaging provider sent to the servlet
* @return a new <code>MimeHeaders</code> object containing the headers
* in the message sent to the servlet
*/
protected static
MimeHeaders getHeaders(HttpServletRequest req)
{
Enumeration enumeration = req.getHeaderNames();
MimeHeaders headers = new MimeHeaders();
while (enumeration.hasMoreElements()) {
String headerName = (String)enumeration.nextElement();
String headerValue = req.getHeader(headerName);
StringTokenizer values = new StringTokenizer(headerValue, ",");
while (values.hasMoreTokens())
headers.addHeader(headerName, values.nextToken().trim());
}
return headers;
}
/**
* Sets the given <code>HttpServletResponse</code> object with the
* headers in the given <code>MimeHeaders</code> object.
*
* @param headers the <code>MimeHeaders</code> object containing the
* the headers in the message sent to the servlet
* @param res the <code>HttpServletResponse</code> object to which the
* headers are to be written
* @see #getHeaders
*/
protected static
void putHeaders(MimeHeaders headers, HttpServletResponse res)
{
Iterator it = headers.getAllHeaders();
while (it.hasNext()) {
MimeHeader header = (MimeHeader)it.next();
String[] values = headers.getHeader(header.getName());
if (values.length == 1)
res.setHeader(header.getName(), header.getValue());
else
{
StringBuffer concat = new StringBuffer();
int i = 0;
while (i < values.length) {
if (i != 0)
concat.append(',');
concat.append(values[i++]);
}
res.setHeader(header.getName(),
concat.toString());
}
}
}
Zusätzlich natürlich onMessage() nach meinen Wünchen implementiert.
Kann mir hier bitte jemand weiterhelfen? Woran liegt das Problem bzw. wie kann ich es Lösen? Gibt es alternativen (ohne komplexe Web-Services pakete) XML über HTTP zu verschicken?[/code]