2017-02-10 12 views
0

У меня есть сервлет 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 здесь. Есть ли лучший способ справиться с ситуацией с дружественной ошибкой? Я пытался избежать простого сломанного изображения в браузере, когда камера выключена.

ответ

-2

Все классы внутри блока TWR должны реализовывать интерфейс AutoCloseable.

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Попробовать-с-ресурсами оператор гарантирует, что каждый ресурс закрыт в конце заявления. Любой объект, который реализует java.lang.AutoCloseable, который включает в себя все объекты, которые реализуют java.io.Closeable, может использоваться как ресурс.

Решение: Внесите свой Camera Класс техники AutoCloseable.

+0

Нет. Я сделал это, как вы предложили, и это не имеет значения. Он скомпилирован ранее как TWR, просто вернул пустое изображение, а не java-ошибку. Это что-то связано с областью и захватом выходного потока (os) ... –