2016-05-04 16 views
0

Ich verwende eine RemoteConverter von einer jBoss-Webanwendung auf einen eigenständigen Server, der als Standard server-standalone im Projekt documents4j enthalten ist.Benutzerdefinierter HttpClient für RemoteConverter von Documents4j

Innen Jboss Ich habe eine alte Version von benötigten Bibliotheken bekommt httpclient-4.0.1.jar und verwandte httpcore-4.0.1.jar so mit vielen ClassDefNotFoundException durch die andere Version des JVM geladen Glases verursacht ich bin vor.

Es ist ein spezifisches Problem mit HttpClientConnectionManager Objekt, das noch nicht verfügbar ist in Version

dieses Problem zu vermeiden Ich mag würde ein benutzerdefinierte HTTP-Client für die standalone-server bluild, weil aufgrund der bisherigen Probleme, es ist nicht möglich für mich zu verwenden Jersey.

Hat jemand einen anderen Client für diesen standalone-server bauen? Was sind die Spezifikationen, um eine benutzerdefinierte RemoteClient zu erstellen?

UPDATE 1

Nach ein wenig Analyse mit Hilfe eines Sniffing-Tools, ich dachte, die Zusammensetzung der Botschaft, also habe ich gerade zu Ende gegangen eine benutzerdefinierte HttpClient für diesen Server, wie folgend:

File wordFile = new File("C:/temp/test.docx"); 
    InputStream targetStream = new FileInputStream(wordFile); 

    URL url = new URL("http://localhost:9998"); 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
    conn.setDoOutput(true); 
    conn.setRequestMethod("POST"); 
    conn.setRequestProperty("Content-Type", "application/vnd.com.documents4j.any-msword"); 
    conn.setRequestProperty("Accept", "application/pdf"); 
    conn.setRequestProperty("Converter-Job-Priority", "1000"); 


    OutputStream os = conn.getOutputStream(); 
    os.write(IOUtils.toByteArray(targetStream)); 
    os.flush(); 

    if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) { 
     throw new RuntimeException("Failed : HTTP error code : " 
      + conn.getResponseCode()); 
    } 

    BufferedReader br = new BufferedReader(new InputStreamReader(
      (conn.getInputStream()))); 
    FileWriter ostream = new FileWriter("C:/temp/test.pdf"); 
    BufferedWriter out = new BufferedWriter(ostream); 
    String output; 
    System.out.println("Output from Server .... \n"); 
    while ((output = br.readLine()) != null) { 
     System.out.println(output); 
     out.write(output+"\n"); 
    } 
    br.close(); 
    out.close(); 
    os.close(); 
    conn.disconnect(); 

Jetzt habe ich ein anderes Problem bekommt, wenn ich versuche gerade erstellt test.pdf Datei zu öffnen, alles weiß, aber mit der richtigen Anzahl der Seiten ist. Wenn ich die Datei mit einem Texteditor öffnen und den Anfang und das Ende der Datei analysieren, fand ich die folgenden Zeichen:

%PDF-1.5 
%µµµµ 
1 0 obj 
[...] 
startxref 
1484122 
%%EOF 

Es scheint eine gute PDF-Datei zu sein.

Es gibt noch etwas anderes mit dieser Datei zu tun, die von REST Server empfangen wurde?

Antwort

1

Bevor Sie Ihre Frage beantworten: Ich würde Ihnen empfehlen, eher shade die Abhängigkeit dann neu zu implementieren.

Ich kann mir vorstellen, dass Sie bei der Implementierung Ihres eigenen Dienstes mit einem Codierungsproblem konfrontiert werden. A BufferedReader übersetzt die eingehenden Daten in Zeichendaten. Lesen Sie keine Daten nach Zeichenzeilen, sondern behandeln Sie sie als Binärdateien. Anstelle von Writer Klassen verwenden Sie die Stream Klassen. Dies ist der Grund, warum die Metadaten korrekt behandelt werden, da sie durch Zeichen repräsentiert werden, aber die tatsächlichen Daten sind illegal, da es sich um binäre Informationen handelt:

InputStream in = conn.getInputStream(); 
OutputStream out = new FileOutputStream("C:/temp/test.pdf"); 
byte[] buffer = new byte[1024]; 
int len; 
while ((len = in.read(buffer)) != -1) { 
    out.write(buffer, 0, len); 
}