У меня есть сервлет JEE 7, который отправляет изображение из сетевой камеры в браузер пользователя. Если камера включена, все будет хорошо, и изображение будет отправлено. Если камера выключена, выбрано мое собственное «DeviceUnavailableException». Затем сервлет отправляет альтернативное изображение, указывающее, что камера выключена - это вид дружественного визуального сообщения об ошибке. Это код: -Почему я не могу попробовать с ресурсами в моем сервлете?
protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
try {
ServletOutputStream os = response.getOutputStream(); // Cannot use try-with-resources here!
Camera camera = new Camera(ip, username, password);
byte[] vImage = camera.getEntropy();
response.setContentType("image/jpeg");
System.out.println("Sending visualisation...");
os.write(vImage);
os.close();
} catch (DeviceUnavailableException e) {
System.err.println(e);
try (InputStream is = PhotonicSignalVisualisation.class
.getResourceAsStream("unavailable.png");
ServletOutputStream os = response.getOutputStream()) {
byte[] uImage = new byte[623]; // need to know exact file size of wait.png
is.read(uImage);
response.setContentType("image/png");
System.out.println("Sending unavailable image...");
os.write(uImage);
} catch (IOException ex) {
System.err.println("No luck sending device unavailable image");
System.err.println(e);
}
} catch (IOException e) {
System.err.println(e);
}
}
Этот код работает.
Странно то, что, хотя у меня может быть оператор try-with-resources (TWR) в блоке catchUnavailableException, я не могу в блоке try вверху. NetBeans предлагает преобразовать в TWR, но когда я это сделаю, изображение не будет возвращено в браузер. Похоже, что os.write (uImage) выполняется, но отправляется в другом месте, а не в браузер!
Я, вероятно, приближаюсь к этому все назад, но я не могу понять проблему TWR здесь. Есть ли лучший способ справиться с ситуацией с дружественной ошибкой? Я пытался избежать простого сломанного изображения в браузере, когда камера выключена.
Нет. Я сделал это, как вы предложили, и это не имеет значения. Он скомпилирован ранее как TWR, просто вернул пустое изображение, а не java-ошибку. Это что-то связано с областью и захватом выходного потока (os) ... –