jax-ws DataHandler getName() пуст при вызове со стороны клиента

У меня проблема с использованием DataHandler с jax-ws. Когда клиент вызывает метод getName() объекта DataHandler, возвращает пустую строку. На стороне сервера это оценивается правильно. Здесь я сообщаю часть кода на стороне сервера и на стороне клиента:

на стороне сервера

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

Почему это происходит?

3 ответа

Сегодня я испытал то же обстоятельство. К счастью, я нашел, почему это так.

Если вы глубже отладите исходный код, вы обнаружите, что среди JAX-WS типизированный параметр DataHandler или результат будут помещены в MIMEPartStreamingDataHandler.

Источник данных MIMEPartStreamingDataHandler - это внутренний класс, называемый StreamingDataSource. Определяемый DataHandler, его метод getName должен быть делегирован его источником данных. Однако метод getName StreamingDataSource просто возвращает пустую строку "". Как:

public String getName() {
    return "";
}

Вы можете получить обзор исходного кода здесь.

Одним из возможных решений этой проблемы является то, что:

  1. Дайте вашему сервису загрузки другой параметр, чтобы указать его имя.
  2. Оберните ваш результат свойством String.

Я тоже столкнулся с той же проблемой, но кое-как, как я использовал 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);
 }

У меня была та же самая проблема, и это занимало меня некоторое время. Как ни странно, я наконец-то обнаружил, что имя файла предоставляется в свойстве contentType объекта DataHandler!! Вот как можно получить имя файла:

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

Ура!

Другие вопросы по тегам