ресурс пути к классу [static/pixel.png] не может быть открыт, поскольку он не существует (Heroku)

#java #spring-boot #heroku #jhipster #pixel

#java #spring-boot #heroku #jhipster #пиксель

Вопрос:

Я разрабатываю приложение Spring boot с использованием Jhipster и пытаюсь добавить пиксель в электронную почту. Пиксельное изображение, сохраненное в папке resources / static. Моя ссылка на пиксель:

     @GetMapping("/email-status/OPENED/{customer}")
    @Timed
    public void mailOpened(@PathVariable String customer, HttpServletResponse response) throws IOException {

        //code...

        InputStream in = new ClassPathResource("/static/pixel.png").getInputStream();

        response.setContentType(MediaType.IMAGE_PNG_VALUE);
        IOUtils.copy(in, response.getOutputStream());
    }
  

Статический проводник папок

Когда я вызываю API из браузера с localhost:8080/api/email-status/OPENED / … отображается пиксельное изображение.

Но когда я звоню из своего домена https://app.mydomain.com/api/email-status/OPENED/123

(Я использую Heroku для хостинга) Я получаю эту ошибку

java.io.FileNotFoundException: ресурс пути к классу [static/pixel.png] не может быть открыт, поскольку он не существует

Кто-нибудь знает, почему это происходит?

Ответ №1:

Мне кажется, что localhost использует сгенерированные классы, где домен использует jar. В последнем случае изображение находится внутри jar и именно поэтому не может быть найдено.

Как указано в документе для ClassPathResource:

Поддерживает разрешение как java.io .Файл, если ресурс пути к классу находится в файловой системе, но не для ресурсов в JAR

Возможно, вам следует рассмотреть возможность использования

 YourClassName.class.getResourceAsStream("/static/pixel.png")
  

Очень полезная ссылка об использовании ресурсов — это «Как использовать значки»

Ответ №2:

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

В этом случае вам придется скопировать изображение в соответствующую папку на вашем сервере.

Ответ №3:

Итак, я не нашел никакого ответа, изображение существует в файлах, но пока не смог использовать какое-либо локальное решение для ресурсов пути..

Я решил разместить изображение и использовать ссылку вместо статического изображения, это мое рабочее решение

 InputStream in = new URL("https://some-host/12345/pixel.png").openStream();
response.setContentType(MediaType.IMAGE_PNG_VALUE);
IOUtils.copy(in, response.getOutputStream());
 
  

И еще одна вещь, которая была для меня обязательной, — это то, что тег img должен содержать все эти параметры

 <img src="image_url(the pixel image)" alt="Logo" title="Logo" style="display:block" width="1" height="1" />