ich soll daten übermitteln die über die Schnittstelle Soap übertragen werden.
Das Problem ist das die im verfahren selber als Parameter nicht ein String haben wollen sondern Base64.
Ich frage mich jetzt wie ich das umsetze, mach das schon seit zwei tagen, hab echt alles gelesen was es irgendwo zulesen gibt.
Geht es Dir nur darum, einen String für die Übertragung über die SOAP-Strecke zu encoden? Das Base-64-Encoding muss man nicht selbst schreiben; dafür kann man eine Library verwenden, z.B. commons-codec von Apache.
ich weiß das es sowas gibt, aber leider hab ich keine ahnung wie ich das anwenden soll!
Ich bin jetzt schon weiter, mein problem jetzt ist das wenn ich mein string in byte umwandle das er vom String der ja die XML datei enthält nur die erste zeile nimmt.
1. Wie mache ich das dass er alle zeile in das byte einließt?
Hier erstmal der Code:
Code:
byte[] paramByteArray = line.getBytes();
try {
call = (Call) service.createCall();
try {
call.setTargetEndpointAddress(new URL(domain));
call.setOperationName(new QName("urn","verfahren"));
call.addParameter("xmlParameter", Constants.XSD_BASE64,ParameterMode.IN);
call.setReturnType(XMLType.XSD_BASE64);
try {
byte[] resultByteArray = ((byte[]) call.invoke(new Object[]{paramByteArray}));
ret = new StringBuffer().append(resultByteArray).toString();
} catch (RemoteException e) {
log.log("Fehler beim Austausch der Daten.");
e.printStackTrace();
}
} catch (MalformedURLException e) {
log.log("Fehler beim erstellen der Parameter.");
e.printStackTrace();
}
} catch (ServiceException e) {
log.log("Fehler beim aufrufen der Services.");
e.printStackTrace();
}
ok, hab noch eine zweite frage,
wenn ich eine Antwort bekomme die ich ja dann wieder in ein String wandle, wie bekomme ich da die Zeilenumbrüche nach den teck´s wieder rein?
1. Problem: ganze xml-Datei (nicht nur eine Zeile) in einen String lesen: s. getFileDataAsString()
2. Problem: Base-64-Encoding /- Decoding: s. encodeString() / decodeBytes()
Code:
import java.io.*;
import org.apache.commons.codec.binary.Base64;
public class Test {
public static void main( String[] args) {
try {
String xmlArgument = getFileDataAsString( new File( "test.xml"));
System.out.println( "xmlArgument:" + xmlArgument);
byte[] encodedArgument = encodeString( xmlArgument);
System.out.println( "encodedArgument:" + encodedArgument);
byte[] encodedResult = doSomeMagicSOAPCall( encodedArgument);
String xmlResult = decodeBytes( encodedResult);
System.out.println( "xmlResult:" + xmlResult);
} catch ( Exception e) {
e.printStackTrace();
}
}
public static String getFileDataAsString( File fil) throws IOException {
StringBuffer sb = new StringBuffer(); //--- mit JDK 1.5 besser: StringBuilder sb = new StringBuilder();
BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream( fil)));
String line;
while ((line = in.readLine()) != null) sb.append( line);
return sb.toString();
}
public static byte[] encodeString( String str) {
if ( str == null) return null;
Base64 b64 = new Base64();
return b64.encode( str.getBytes());
}
public static String decodeBytes( byte[] bytes) {
if ( bytes == null) return null;
Base64 b64 = new Base64();
return new String( b64.decode( bytes));
}
public static byte[] doSomeMagicSOAPCall( byte[] bytes) {
return bytes; //--- just a dummy
}
}
if(verfahren.equals("test"))
{
System.out.println("Anfang");
String xmlResult = null;
String xmlArgument = null;
try {
xmlArgument = getFileDataAsString( new File( pfad_out));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println( "xmlArgument:" + xmlArgument);
byte[] encodedArgument = encodeString( xmlArgument);
System.out.println( "encodedArgument:" + encodedArgument);
try {
call = (Call) service.createCall();
try {
call.setTargetEndpointAddress(new URL(domain));
call.setOperationName(new QName("urn:akdb:ok.komm:komm-service","callApplicationByte"));
call.addParameter("xmlParameter", Constants.XSD_BASE64,ParameterMode.IN);
call.setReturnType(XMLType.XSD_BASE64);
call.setEncodingStyle(Constants.URI_SOAP11_ENC);
try {
byte[] encodedResult = ((byte[]) call.invoke(new Object[]{encodedArgument}));
xmlResult = decodeBytes( encodedResult);
System.out.println( "xmlResult:" + xmlResult);
System.out.println("Ende");
} catch (RemoteException e) {
log.log("Fehler beim Austausch der Daten.");
e.printStackTrace();
}
} catch (MalformedURLException e) {
log.log("Fehler beim erstellen der Parameter.");
e.printStackTrace();
}
} catch (ServiceException e) {
log.log("Fehler beim aufrufen der Services.");
e.printStackTrace();
}
printIt(pfad_in, xmlResult);
}
}
private static void printIt(String datei, String retval) {
Log log = new Log();
File f = new File(datei);
if (f.exists() && f.canWrite()) {
System.out.println(retval);
f.delete();
System.out.println("Delete " + datei);
}
try {
FileWriter write = new FileWriter(datei, true);
write.write(retval);
write.close();
} catch (IOException e) {
log.log("Es wurde ein Fehler beim schreiben der XML - Datei festgestellt!");
// e.printStackTrace();
}
}
public static String getFileDataAsString( File fil) throws IOException {
StringBuffer sb = new StringBuffer(); //--- mit JDK 1.5 besser: StringBuilder sb = new StringBuilder();
BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream( fil)));
String line;
while ((line = in.readLine()) != null) sb.append( line);
return sb.toString();
}
public static byte[] encodeString( String str) {
if ( str == null) return null;
Base64 b64 = new Base64();
return b64.encode( str.getBytes());
}
public static String decodeBytes( byte[] bytes) {
if ( bytes == null) return null;
Base64 b64 = new Base64();
return new String( b64.decode( bytes));
}
}
Leider bleibt ein Problem jetzt wo ich es übersetzt habe, fliegt mir alles um die ohren was das "invoka" angeht.
Hier ist der Fehler, weiß jemand was da falsch ist, bestimmt ein folge fehler oder?
Code:
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.lang.NullPointerException
faultActor:
faultNode:
faultDetail: {http://xml.apache.org/axis/}stackTrace: AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.lang.NullPointerException
faultActor:
faultNode:
faultDetail:
java.lang.NullPointerException
at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:260)
at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:169)
at org.apache.axis.encoding.DeserializationContextImpl.endElement(DeserializationContextImpl.java:1015)
at org.apache.xerces.parsers.SAXParser.endElement(SAXParser.java:1403)
at org.apache.xerces.validators.common.XMLValidator.callEndElement(XMLValidator.java:1480)
at org.apache.xerces.framework.XMLDocumentScanner$ContentDispatcher.dispatchXMLDocumentScanner.java:1204)
at org.apache.xerces.framework.XMLDocumentScanner.parseSome(XMLDocumentScanner.java:381)
at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1081)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at org.apache.axis.encoding.DeserializationContextImpl.parse(DeserializationContextImpl.java:242)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:538)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:376)
at org.apache.axis.client.Call.invokeEngine(Call.java:2583)
at org.apache.axis.client.Call.invoke(Call.java:2553)
at org.apache.axis.client.Call.invoke(Call.java:2248)
at org.apache.axis.client.Call.invoke(Call.java:2171)
at org.apache.axis.client.Call.invoke(Call.java:1691)
at pk.informationsregister.prokommunal.connect._con(Connect.java:139)
at pk.informationsregister.prokommunal.connect.con(Connect.java:69)
at pk.informationsregister.prokommunal.StartInfoReg.main(StartInfoReg.java:43)
java.lang.NullPointerException
at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:260)
at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:169)
at org.apache.axis.encoding.DeserializationContextImpl.endElement(DeserializationContextImpl.java:1015)
at org.apache.xerces.parsers.SAXParser.endElement(SAXParser.java:1403)
at org.apache.xerces.validators.common.XMLValidator.callEndElement(XMLValidator.java:1480)
at org.apache.xerces.framework.XMLDocumentScanner$ContentDispatcher.dispatch(XMLDocumentScanner.java:1204)
at org.apache.xerces.framework.XMLDocumentScanner.parseSome(XMLDocumentScanner.java:381)
at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1081)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at org.apache.axis.encoding.DeserializationContextImpl.parse(DeserializationContextImpl.java:242)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:538)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:376)
at org.apache.axis.client.Call.invokeEngine(Call.java:2583)
at org.apache.axis.client.Call.invoke(Call.java:2553)
at org.apache.axis.client.Call.invoke(Call.java:2248)
at org.apache.axis.client.Call.invoke(Call.java:2171)
at org.apache.axis.client.Call.invoke(Call.java:1691)
at pk.informationsregister.prokommunal.connect._con(Connect.java:139)
at pk.informationsregister.prokommunal.connect.con(Connect.java:69)
at pk.informationsregister.prokommunal.StartInfoReg.main(StartInfoReg.java:43)
Was muss ich denn am Code ändern das es geht?
ps.: Murray Spitzenklasse was du da geschrieben hast, solche programmiere wie dich brauchen wir noch viel mehr.
Hoffe das ich das in ein paar woche auch ähnlich kann!
Ich habe mit dem Axis-Zeug noch nicht so intensiv gearbeitet; ich meine aber, dass hier ein Fehler auf der Server-Seite aufgetreten ist und als SOAP-Fault zurückgeschickt wurde. Die Axis-Library wandelt dann solche Faults (die ja eigentlich nur XML-Klumpen sind) direkt in Exceptions um, daher ist auch der Stack-Trace der Exception ziemlich uninteressant (weil für alle Exceptions gleich).
Kontrollierst Du auch den Server, oder ist das für Dich eine Black-Box? Im ersten Fall ist es leichter, dann sollte die NullPointerException auch dort (dann mit dem richtigen Stack-Trace) zu sehen sein.