Spring MVC 4.2.4/Контроллер с RequestMapping(/**) и статическими ресурсами

У меня есть угловое приложение, которое использует ui-router и обслуживается java-приложением SpringMvc (4.2.4). Я решил сопоставить любые запросы с одним контроллером/методом, который загружает одну страницу JSP моего проекта.

Но когда я пытаюсь добавить сопоставления статических ресурсов, чтобы загрузить файлы js и css, эти статические ресурсы игнорируются... Каждый запрос внутри пути [mayapp]/resources/* приводит к моей единственной странице jsp.

Вот мой конфиг:

web.xml

      <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring/servlet.xml</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>

servlet.xml

      <context:component-scan base-package="com.adveasys.omrh.front.web" />
      <mvc:annotation-driven></mvc:annotation-driven>

      <mvc:resources mapping="/resources/**" location="/resources/">
       <mvc:resource-chain resource-cache="false" auto-registration="false">
         <mvc:resolvers>
           <bean class="org.springframework.web.servlet.resource.GzipResourceResolver"/>
           <bean class="org.springframework.web.servlet.resource.PathResourceResolver"/>
         </mvc:resolvers>
       </mvc:resource-chain>
     </mvc:resources> 

       <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="prefix" value="/WEB-INF/pages/" />
         <property name="suffix" value=".jsp" />
      </bean>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/pages/" />
      <property name="suffix" value=".jsp" />
    </bean>

MainController.java

@RequestMapping("/**")
public ModelAndView mainPage(HttpServletRequest request) throws JsonProcessingException {

Прежде чем возникла эта проблема, я использовал сервлет по умолчанию в web.xml для каждого /resources/*, но я создаю версию .gz моих скриптов/css с maven, и я хочу, чтобы такая конфигурация могла использовать GzipResourceResolver .


Вещи, которые я уже пробовал, но не работали

  • объявить 2 различных DispatcherServlet в web.xml, один только для JSP, другой только для ресурсов. (Я разделил конфигурацию mvc на 2 разных файла для каждого сервлета)
  • @RequestMapping("/") в контроллере, пользователь должен войти на сайт по корневому адресу, что недопустимо.
  • Я попытался установить порядок и как свойство для InternalResourceViewResolver

Заранее спасибо.


person Djamon44    schedule 08.01.2016    source источник
comment
Вы должны изменить значение сопоставления запросов для MainController на разные /** и /resources, например: @RequestMapping(/yourapp).   -  person An Nguyen    schedule 08.01.2016
comment
Это не то, чего я хотел. Я знаю, что это сработало бы. Я нашел решение, смотрите ответ ниже   -  person Djamon44    schedule 09.01.2016


Ответы (1)


Хорошо, после копания в режиме отладки. HandlerMappings, где в этом порядке:

  • RequestMappingHandlerMapping (один @Controller, внутреннее свойство "order" = 0)
  • SimpleUrlHandlerMapping (ресурсы, внутреннее свойство "order" = 0)
  • BeanNameUrlHandlerMapping (не знаю, что это такое... ^^)

При вызове файла /resource/* RequestMappingHandlerMapping первым ответил как допустимый кандидат.

после добавления такого порядка в конфигурацию Spring:

<mvc:resources mapping="/resources/**" location="/resources/" order = "-1">

Это сработало.

person Djamon44    schedule 08.01.2016