#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
— это какое-то зарезервированное слово или что-то в этом роде 🙂 Спасибо за вашу помощь!