Сквозная передача двоичных данных – вложение SOAP, часть 3: создание кода для веб-службы и ее тестирование
В этом уроке рассматривается добавление кода в веб-службу/класс сеансного компонента для преобразования файлов JPEG в массивы байтов, а массивов байтов – в объекты java.awt.Image. Также можно добавить код в операции общедоступных веб-служб для возврата данных объектов Image. И, наконец, выполняется тестирование веб-службы в браузере с помощью служебной программы тестирования веб-служб IDE NetBeans.
Ранее было создано веб-приложение с набором файлов JPEG и веб-службой. Веб-служба реализуется как сеансный компонент без поддержки состояния. Веб-служба содержит две пустые веб-операции. В этом уроке рассматривается добавление кода в веб-службу для преобразования файлов JPEG в массивы байтов, а массивов байтов – в объекты java.awt.Image. Также можно добавить код в операции общедоступных веб-служб для возврата данных объектов Image.
Получение файла JPEG в виде массива байтов
В этом разделе рассматривается добавление нескольких закрытых методов в тело класса FlowerService. Эти методы принимают имя изображения цветка, создают путь к файлу JPEG цветка и возвращают двоичное представление файла JPEG (массив байтов). В последующих разделах описывается создание кода для общедоступных операций веб-служб, чтобы операции могли вызывать эти закрытые методы.
Откройте представление Source ("Исходный код") проекта. Необходимо добавить код, который принимает имя изображения, создает путь к изображению на основе этого имени и представляет изображение в виде массива байтов. Введите или вставьте в тело класса FlowerService следующий код:
Появится предупреждение о том, что среде IDE не удается найти URL-адрес. Добавьте оператор импорта для java.net.URL, вручную или путем нажатия Ctrl-Shift-I (⌘-Shift-I в Mac).
Появится новое предупреждение. В предупреждении сообщается о том, что среде IDE не удается найти метод getBytes. Щелкните значок предупреждения левой кнопкой мыши и щелкните всплывающую подсказку для создания метода getBytes.
В окне редактора будет выполнен переход к только что созданному методу getBytes. Добавьте в метод следующий код. Этот код служит для установки подключения к URL-адресу, переданному от метода getFlowerBytes, и возврата элемента InputStream. Затем код считывает входной поток порциями по 1024 байта, сохраняет байты в буфере массива данных и записывает ByteArrayOutputStream на основе содержимого буфера.
Добавьте операторы импорта для java.io.InputStream и java.io.ByteArrayOutputStream.
Чтение массива байтов как изображения
В этом разделе рассматривается добавление закрытого метода в тело класса FlowerService. Этот метод принимает массив байтов, представляющих файл JPEG, и возвращает объект java.awt.Image. Обратите внимание, что массив байтов создается посредством метода getBytes(URL), создание которого изучалось в разделе Получение файла JPEG в виде массива байтов.
Добавьте в тело класса FlowerService закрытый метод getImage. Возвращаемым типом метода getImage является Image. Метод принимает два параметра. Первым параметром является массив байтов, созданный посредством метода getBytes. Вторым параметром является булево значение, указывающее, является ли изображение эскизом. Метод getImage выдает исключение IOException.
Добавьте код, использующий объект ImageReader для чтения объекта ImageInputStream и возврата элемента Image на основе этого объекта, а также параметров чтения изображения.
Нажмите Ctrl-Shift-I (⌘-Shift-I в MacOS). Откроется диалоговое окно Fix All Imports ("Исправление всех операторов импорта"). Примите настройку по умолчанию диалогового окна "Исправление всех операторов импорта" и нажмите кнопку "ОК".
Добавьте следующий код реализации в метод getFlower() для получения цветка по его имени и возврата изображения этого цветка. Обратите внимание, что это код вызывает метод getFlowerBytes(name) для получения файла JPEG в виде массива байтов. Затем код вызывает закрытый метод getImage для возврата массива байтов в виде объекта Image.
Создание списка массивов байтов для всех файлов JPEG
В верхней части тела класса FlowerService создайте массив строк с названиями всех цветов.
private static final String[] FLOWERS = {"aster", "honeysuckle", "rose", "sunflower"};
Добавьте метод для создания объекта ArrayList и добавления массива байтов для каждого цветка в список List.
private List allFlowers() throws IOException {
List flowers = new ArrayList();
for (String flower:FLOWERS) {
URL resource = this.getClass().getResource("/org/flower/resources/"+flower+".jpg");
flowers.add(getBytes(resource));
}
return flowers;
}
Добавьте операторы импорта для java.util.ArrayList и java.util.List.
Реализация метода getThumbnails
Измените метод getThumbnails() следующим образом. Обратите внимание на добавление кода реализации и изменение типа возврата с List на List<Image>. Также учтите, что булево значения isThumbnail true передается в метод getImage. Код реализации метода getThumbnails вызывает метод allFlowers, чтобы создать список массивов байтов для всех файлов JPEG. Метод getThumbnails затем создает список List объектов Image и вызывает метод getImage для каждого цветка с целью возврата массива байтов для этого цветка в качестве объекта Image и добавления объекта Image в объект List.
@WebMethod(operationName = "getThumbnails")
public List<Image> getThumbnails() throws IOException {
List<byte[]> flowers = allFlowers();
List<Image> flowerList = new ArrayList<Image>(flowers.size());
for (byte[] flower : flowers) {
flowerList.add(getImage(flower, true));
}
return flowerList;
}
Объединенная веб-служба/сеансный компонент готовы. В итоге класс веб-службы должен выглядеть следующим образом:
private List allFlowers() throws IOException {
List flowers = new ArrayList();
for (String flower : FLOWERS) {
URL resource = this.getClass().getResource("/flower/album/resources/" + flower + ".jpg");
flowers.add(getBytes(resource));
}
return flowers;
}
}
Тестирование веб-службы
После создания веб-службы можно развернуть ее и протестировать.
Порядок тестирования веб-службы.
Щелкните правой кнопкой мыши узел FlowerAlbumService и выберите пункт "Развертывание". IDE компилирует исходный код, запускает сервер GlassFish и выполняет развертывание файла WAR проекта на сервере. При открытии окна "Службы" можно просмотреть развернутую веб-службу FlowerService в узле "Приложения" сервера.
Важно! Требуется GlassFish Server Open Source Edition 3.1 или более поздняя версия.
Разверните узел Web Services ("Веб-службы") проекта. Щелкните правой кнопкой мыши элемент FlowerService и выберите пункт "Тестировать веб-службу".
В браузере откроется средство тестирования веб-службы. Введите текст "rose" в поле параметра getFlower.
Нажмите кнопку getFlower. Среда IDE выведет в браузере данные о вызове. Обратите внимание на область возврата метода: там расположен шифр. Однако на экране должно быть представлено изображение, а не последовательность символов. Поскольку java.awt.Image не является допустимым типом схемы, необходимо вручную настроить файл схемы для возврата двоичных данных изображения/jpeg. Эта процедура рассматривается в следующем учебном курсе.
Для отправки комментариев и предложений, получения поддержки и новостей о последних разработках, связанных с Java EE IDE NetBeans присоединяйтесь к списку рассылки .