1

我正在使用RemoteConverter从 jBoss Web 应用程序到作为默认server-standalone包含在文档 4j 项目中的独立服务器。

在 jboss 内部,我有一个旧版本的所需库httpclient-4.0.1.jar和相关库,httpcore-4.0.1.jar所以我面临很多ClassDefNotFoundException由 JVM 加载的不同版本的 jar 引起的问题。

对象存在特定问题,HttpClientConnectionManager版本中尚不可用

为了避免这个问题,我想为 .bluild 自定义 http 客户端standalone-server,因为由于之前的问题,我无法使用Jersey.

有人为此建立了不同的客户端standalone-server吗?建立定制的规格是什么RemoteClient

更新 1

在嗅探工具的帮助下进行了一些分析后,我弄清楚了消息的组成,所以我刚刚结束了HttpClient该服务器的自定义,如下所示:

    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();

现在我遇到了另一个问题,如果我尝试打开刚刚创建的 test.pdf 文件,它全是白色的,但页数正确。如果我用文本编辑器打开文件并分析文件的开头和结尾,我发现以下字符:

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

它似乎是一个很好的 PDF 文件。

与从 REST 服务器接收的文件还有其他关系吗?

4

1 回答 1

2

在回答您的问题之前:我建议您宁愿隐藏依赖关系然后重新实现它。

我可以想象您在实现自己的服务时遇到了编码问题。ABufferedReader将输入数据转换为字符数据。不要按字符行读取数据,而是将其视为二进制。使用Stream类代替Writer类。这就是为什么元数据被正确处理的原因,因为它是由字符表示的,但实际数据是非法的,因为它是二进制信息:

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);
}
于 2016-05-05T22:07:06.137 回答