1

jax-ws での DataHandler の使用に問題があります。クライアントが DataHandler の getName() メソッドを呼び出すと、空の文字列が返されます。サーバー側では、正しく評価されます。ここでは、サーバー側とクライアント側のコードの一部を報告します。

サーバ側

public @XmlMimeType("application/octet-stream") DataHandler fileDownload(String name) {
   try {
         File file = new File("/tmpwk/share/SharedRepository/apps-data/jaxws-large_upload/" + name);
         FileDataSource fds = new FileDataSource(file);
     DataHandler dh = new DataHandler(fds);
         // Note: getName(), return a String with file name.
     System.out.println("File Name = " + dh.getName() );
     System.out.println("Content Type  " + dh.getContentType());

     System.out.println("quiting from downloadFile...");    
     return dh;
    } catch(Exception e) {
        throw new WebServiceException(e);
    }

}

クライアント側

public void download() throws IOException {
    System.out.println(">>>>> download <<<<<<");
    MTOMFeature feature = new MTOMFeature();
    UploadImplService service = new UploadImplService();
    UploadImpl proxy = service.getUploadImplPort(feature);        
    Map<String, Object> ctxt = ((BindingProvider)proxy).getRequestContext();
    ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192); 


    DataHandler dh = proxy.fileDownload("file.bin");
    InputStream in = dh.getInputStream();

    //Note:  getName() return a empty string, why ????
            System.out.println("File Name = " + dh.getName());
    System.out.println("Content Type = " + dh.getContentType());


    File file = new File("/tmp/dfile.bin");
    OutputStream out = new FileOutputStream(file);

    // Transfer bytes from in to out
    byte[] buf = new byte[8192];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}

なぜこれが起こるのですか?

4

3 に答える 3

1

今日、私は同じ状況を経験しました。幸いなことに、その理由がわかりました。

ソース コードをさらに詳しくデバッグすると、JAX-WS の中で、DataHandler 型付きパラメーターまたは結果が MIMEPartStreamingDataHandler にラップされていることがわかります。

MIMEPartStreamingDataHandler の dataSource は、StreamingDataSource という内部クラスです。DataHandler によって定義され、その getName メソッドはその dataSource によって委任される必要があります。ただし、StreamingDataSource の getName メソッドは、空の文字列 "" を返すだけです。と同じように:

public String getName() {
    return "";
}

ここでソース コードの概要を確認できます。

この問題の考えられる解決策の 1 つは、次のとおりです。

  1. アップロード サービス メソッドに別のパラメーターを指定して、その名前を指定します。
  2. 結果を String プロパティでラップします。
于 2013-10-24T21:36:33.547 に答える
0

私も同じ問題に遭遇しましたが、StreamingDataHandler をどのように使用したか、私のコードは機能します。

dh=proxy.get("file.bin");   //WS CALL
if( dh!=null){          
    StreamingDataHandler sdh = (StreamingDataHandler)dh;            
    File file = new File(filePath+ File.separator +fileName);
    sdh.moveTo(file);
 }
于 2012-10-01T10:08:15.253 に答える
0

私は同じ問題を抱えていて、しばらく忙しかったです。奇妙に思えるかもしれませんが、最終的に、ファイルの名前が DataHandler オブジェクトの contentType プロパティで提供されていることを発見しました!! ファイル名を取得する方法は次のとおりです。

String contentType = dataHandler.getContentType();
//if you print out contentType, it is something like this:  "application/pdf; name=9ad22859-cdc9-4de5-b374-2c36acc5c253.pdf"
String fileName = (contentType.substring(contentType.indexOf("name=") + 5)).trim();

乾杯!

于 2015-03-18T01:55:28.170 に答える