2013-11-25 3 views
6

При запуске проекта загрузки Spring (java -jar /path/to/war.war) файлы .jsp не найдены.Spring-Boot не находит страницы JSP в файле WAR

Методы, аннотированные с помощью @ResponseBody, работают нормально. Резольвер представления подходит к правильному пути к страницам JSP, но они не найдены. Этот проект имеет один класс конфигурации и не web.xml.

Класс конфигурации:

@Configuration 
@EnableAutoConfiguration 
@EnableWebMvc 
@ComponentScan (basePackages = "org.ghc.security.web") 
class ScMain extends WebMvcConfigurerAdapter { 


    // SpringBoot BootStrap... 
    static void main (String[] args) { 
     ApplicationContext ctx = SpringApplication.run (ScMain, args) 

     System.out.println("Let's inspect the beans provided by Spring Boot:"); 

     String[] beanNames = ctx.getBeanDefinitionNames(); 
     Arrays.sort(beanNames); 
     beanNames.each { beanName -> 
      System.out.println(beanName); 
     } 
    } 


    @Bean 
    InternalResourceViewResolver internalResourceViewResolver() { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver() 
     viewResolver.setPrefix("/WEB-INF/jsp/") 
     viewResolver.setSuffix(".jsp") 
     viewResolver 
    } 
} 

Контроллер

@Controller 
class Running { 

    @RequestMapping ("/alive") // This works fine 
    @ResponseBody 
    String amIAlive() { 
     "ALIVE!" 
    } 


    @RequestMapping ("/alive/page") // Path to page resolved, but file not found! 
    ModelAndView amIAlivePage() { 
     new ModelAndView("alivepage") 
    } 
} 

Error Log

2013-11-25 09: 08: 28,714 ОШИБКА 1549 - - [tp19453977 83-20] org.apache.jasper.servlet.JspServlet: PWC6117: Файл «% 2FUsers% 2Fnode42% 2FDevelopment% 2Fmock-security-ui% 2Fbuild% 2Flibs% 2Fmock-security-ui-2.06-SNAPSHOT.war% 2FWEB-INF % 2Fjsp% 2Falivepage.jsp»не найдено

путь к файлу .war в записи журнала правильно, и путь в войне файла (WEB-INF/JSP/alivepage.jsp) является правильным. Ответ тот же, будь то Jetty или Tomcat (приведенный выше журнал был из Jetty). Я также попытался не использовать распознаватель вида, указав один из них, как указано выше, или установил разрешение представления через свойства. Я полностью смущен, потому что все выглядит так, как будто работает, за исключением этой маленькой детали. И аннотированный метод @ResponseBody в контроллере отлично работает.

Если у кого-то есть предложения, я, безусловно, ценю вход!

+0

Пробуйте добыть войну и запустить программу оттуда. –

+0

Это справедливый вопрос. Подробности для последующего, но результат дает: '2013-11-25 11: 35: 37.967 WARN 4924 --- [nio-8080-exec-1] osweb.servlet.PageNotFound: сопоставления не найдено для HTTP-запроса с URI [ /WEB-INF/jsp/alivepage.jsp] в DispatcherServlet с именем 'dispatcherServlet'' – node42

+0

Командная строка (сокращенно) была 'java -cp.: WEB-INF/lib/validation-api-1.0.0.GA.jar : WEB-INF/classes org/springframework/boot/loader/WarLauncher', где было намного больше записей WEB-INF/lib. – node42

ответ

3

Я не думаю, что JSP в исполняемых архивах полностью поддерживаются в Spring Boot (это в списке), поэтому я попытался бы заставить его работать сначала с a) развернутой WAR и/или b) взорванными архивировать (или запускать из IDE) или запускаться из источника. Как только это будет работать, вам все равно придется ждать полной поддержки JSP (вклады приветствуются), но, по крайней мере, вы будете знать, что он работает. Ошибка, которую вы видите в развернутой WAR (отсутствие сопоставления), указывает на то, что происходит что-то еще. Обратите внимание, что есть JSP sample in Spring Boot, если вы хотите что-то сравнить - работает до точки (JSP разрешен и визуализирован).

Редакция: Spring taglibs, поддержка JSTL и EL, похоже, работают в примере выше. Я просто обновил его, чтобы добавить JSTL и протестировать его из IDE и как исполняемую WAR.

2

У меня была аналогичная проблема, вызванная не установленным сервлетом по умолчанию. Я должен был сделать это в моем extends DelegatingWebMvcConfiguration классе:

@Override 
protected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
    configurer.enable(); 
} 
17

У меня была такая же проблема, и в моем случае это произошло из-за отсутствия библиотеки в пути к классам.

Spring Загрузочный не включает в себя Джаспера по умолчанию, и поэтому JSP рендеринга не работает, если вы явно не включают библиотеку:

Для Gradle:

compile("org.apache.tomcat.embed:tomcat-embed-jasper") 

Для Maven:

<dependency> 
    <groupId>org.apache.tomcat.embed</groupId> 
    <artifactId>tomcat-embed-jasper</artifactId> 
    <scope>provided</scope> 
</dependency> 
+1

Это спасло мою задницу. Спасибо огромное! –

+0

Спасибо. Gradle с версией: 'compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', версия: '9.0.0.M26'' –

2

Я решил эту проблему путем незначительной коррекции в определении Bean ition.

@Bean 
    InternalResourceViewResolver internalResourceViewResolver() { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver() 
     viewResolver.setPrefix("WEB-INF/jsp/") 
     viewResolver.setSuffix(".jsp") 
     return viewResolver; 
    } 
+0

Мне пришлось сделать это, чтобы получить мой исполняемая война для правильной работы при развертывании. В противном случае это будет нормально работать в Intellij, но не в развернутом env. –

Смежные вопросы