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 "";
}
Вы можете получить обзор исходного кода здесь.
Одним из возможных решений этой проблемы является то, что:
- Дайте вашему сервису загрузки другой параметр, чтобы указать его имя.
- Оберните ваш результат свойством 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();
Ура!