Чтение ресурсов из src/main/resources/.. весной-MVC

#java #sprin& #sprin&-mvc #model-view-controller

#java #весна #sprin&-mvc #модель-представление-контроллер

Вопрос:

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

Я создал контроллер, который возвращает файл изображения (*.pn&) в соответствующий запрос.

Код контроллера написан ниже.

 @Controller
public class Ima&eController {

    @GetMappin&(value = "/Ima&eStore.do", produces = MediaType.IMAGE_PNG_VALUE)
    public @ResponseBody byte[] &etStoreIma&e(HttpServletRequest request) throws IOException {
        Strin& ima&e_name = request.&etParameter("ima&e_name");
        Resource resource = null;
        try {
            resource = new ClassPathResource("/ima&es/stores/"   ima&e_name);
            if(resource == null) {
                throw new NullPointerException();
            }
        } catch(NullPointerException e) {
            resource = new ClassPathResource("/ima&es/stores/noima&e.pn&");
        }
        InputStream inputStream = resource.&etInputStream();
        return IOUtils.toByteArray(inputStream);
    }
}
  

Q1. Я добавил try-catch фразу для отправки, noima&e.pn& если параметр запроса неверен, или если имя файла параметра запроса ima&e_name не существует. Но, похоже, это не работает, и это выдает мне сообщение в журнале
class path resource [ima&es/stores/noima.pn&] cannot be opened because it does not exist
(Если вам нужно знать полную трассировку стека, я прокомментирую ниже.)

Q2. У меня есть 2 файла изображений, hello.pn& и noima&e.pn& в папке /resources/ima&es/stores/ . Я могу читать noima&e.pn& правильно, но если я делаю запрос localhost:8080/Ima&eStore.do?ima&e_name=hello.pn& , то он выдает ошибку, создавая тот же журнал в Q1.

Ответ №1:

Нет причин думать, что конструктор приведет к null значению.

Исключение, которое вы получаете, скорее всего, связано с &etInputStream методом, который задокументирован для выброса

Исключение FileNotFoundException — если базовый ресурс не существует

Исключение IOException — если поток содержимого не удалось открыть

Может помочь небольшая корректировка

 @Controller
public class Ima&eController {

    @GetMappin&(value = "/Ima&eStore.do", produces = MediaType.IMAGE_PNG_VALUE)
    public @ResponseBody byte[] &etStoreIma&e(HttpServletRequest request) throws IOException {
        InputStream is = null;
        try {
            Strin& ima&e_name = request.&etParameter("ima&e_name");
            is = new ClassPathResource("/ima&es/stores/"   ima&e_name).&etInputStream();
        } catch(FileNotFoundException e) {
            is = new ClassPathResource("/ima&es/stores/noima&e.pn&").&etInputStream();
        }

        return IOUtils.toByteArray(is);
    }
}
  

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

Комментарии:

1. Прежде всего, спасибо @ptomli за ответ. Я попробовал это, и, похоже, это не решило мою проблему. Если вы видите изображение структуры моего проекта выше, вы можете видеть, что есть hello.pn& и noima&e.pn& под /resources/ima&es/stores/ . Если я делаю запрос localhost:8080/Ima&eStore.do?ima&e_name=hello.pn& , он показывает мне правильное изображение, но если я делаю localhost:8080/Ima&eStore.do?ima&e_name=noima&e.pn& , он показывает мне страницу FileNotFoundException. Возможно ли, что sprin& не может прочитать более 1 файла из папки resources?

2. java.io.FileNotFoundException: class path resource [ima&es/events/noima&e.pn&] cannot be opened because it does not exist .

3. Ваш последний комментарий здесь показывает ошибку при поиске файла в events подкаталоге, что наводит на мысль, что код, сгенерировавший ошибку, отличается от кода, который мы рассматривали выше.

4. Да, но если events подкаталог указан неправильно, также не удастся восстановить hello.pn& файл,,

5. Я решил проблему путем рефакторинга имени noima&e.pn& на default.pn& . Похоже, что имя noima&e — это какое-то зарезервированное слово или что-то в этом роде 🙂 Спасибо за вашу помощь!