Spring mvc 3 с плитками 2 дает 400 неверных запросов

Я пытаюсь добавить Apache Tiles в простое веб-приложение Spring MVC, с которым я играю, и я не могу заставить его работать (он работал без плиток). Любой запрос, который я делаю, возвращает 400 неверных запросов, в журнале ничего не появляется (даже установлено значение DEBUG), поэтому я не уверен, с чего начать отладку. Насколько я могу судить, метод сопоставления контроллера никогда не вызывается, так как там есть журнал, и он не отображается в журнале (плюс до этого я получил бы много отладочной информации от весны о разрешении сопоставления с контроллером до этого на самом деле назывался - который теперь не появляется).

Мои файлы конфигурации выглядят следующим образом (все в /WEB-INF/): web.xml:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd                 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

    <!-- The controllers are autodetected POJOs labeled with the @Controller 
        annotation. -->
    <context:component-scan base-package="com.myapp.controller"
        use-default-filters="false">
        <context:include-filter expression="org.springframework.stereotype.Controller"
            type="annotation" />
    </context:component-scan>

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving 
        up static resources -->
    <mvc:resources location="/resources/" mapping="/resources/**" />

    <!-- Allows for mapping the DispatcherServlet to "/" by forwarding static 
        resource requests to the container's default Servlet -->
    <mvc:default-servlet-handler />

    <mvc:annotation-driven />

    <bean id="tilesConfigurer"
        class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/tiles.xml</value>
            </list>
        </property>
    </bean>    
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.tiles2.TilesView" />
    </bean>
</beans>
5.xsd"> <display-name>myapp</display-name> <!-- Enable escaping of form submission contents --> <context-param> <param-name>defaultHtmlEscape</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value> </context-param> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter> <filter-name>HttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>HttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Creates the Spring Container shared by all Servlets and Filters --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Handles Spring requests --> <servlet> <servlet-name>myapp</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>myapp</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <session-config> <session-timeout>10</session-timeout> </session-config> </web-app>

myapp-servlet.xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd                 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

    <!-- The controllers are autodetected POJOs labeled with the @Controller 
        annotation. -->
    <context:component-scan base-package="com.myapp.controller"
        use-default-filters="false">
        <context:include-filter expression="org.springframework.stereotype.Controller"
            type="annotation" />
    </context:component-scan>

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving 
        up static resources -->
    <mvc:resources location="/resources/" mapping="/resources/**" />

    <!-- Allows for mapping the DispatcherServlet to "/" by forwarding static 
        resource requests to the container's default Servlet -->
    <mvc:default-servlet-handler />

    <mvc:annotation-driven />

    <bean id="tilesConfigurer"
        class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/tiles.xml</value>
            </list>
        </property>
    </bean>    
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.tiles2.TilesView" />
    </bean>
</beans>

плитки.xml

<tiles-definitions>    
    <definition name="product_detail" template="/WEB-INF/layout/detail.jsp">
        <put-attribute name="header" value="/WEB-INF/view/header.jsp" />
        <put-attribute name="banner" value="" />
        <put-attribute name="body" value="/WEB-INF/view/product.jsp" />
        <put-attribute name="footer" value="/WEB-INF/view/footer.jsp" />
    </definition>
</tiles-definitions>

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

И для контроллера ProductController.java:

@Controller
@RequestMapping("/product")
public class ProductController {

    protected Logger logger = Logger.getLogger(getClass());

    @Autowired
    private ProductService productService;

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public ModelAndView getProduct(@PathVariable Long id) {
        logger.info("GET product " + id);
        Product product = productService.find(id);
        ModelAndView mv = new ModelAndView("product_detail", "product", product);
        return mv;
    }
}

Развертывание этого с помощью встроенного в maven плагина tomcat и переход на localhost: 8080/myapp/product/1 просто дает код HTTP 400 без каких-либо других указаний на то, что что-то пошло не так. В БД есть товар с таким id и все работает от контроллера до того, как я пробовал до добавления тайлов.

Извините за удаление кода, но я не могу заставить его работать в течение некоторого времени, и я понятия не имею, что еще попробовать или с чего начать отладку.

Есть ли способ принудительно зарегистрировать проблему, когда возвращается неверный запрос 400?


person Andrei Fierbinteanu    schedule 15.07.2012    source источник


Ответы (1)


Вам не хватает ссылки на ваш myapp-servlet.xml в конфигурации сервлета.

<!-- Handles Spring requests -->
<servlet>
    <servlet-name>myapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/spring/myapp-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
person marcaurele    schedule 26.07.2012
comment
К сожалению, это не решает. И я почти уверен, что он загружает его, потому что установка неправильного пути дает ошибку FileNotFound. Также у меня сложилось впечатление, что если вы его не предоставите, он автоматически ищет servletname-servlet.xml в WEB-INF, и я думаю, что это было раньше, поскольку при загрузке контейнера не возникало ошибок. И журнал запуска также содержал сообщения о сопоставлении метода контроллера, который предполагает, что он нашел файл servlet.xml, в котором я определил сканирование контроллера. - person Andrei Fierbinteanu; 26.07.2012