Spring MVC annotation configuration error

I'm trying to improve the spring mvc config so that it doesn't require a new config file for every servlet I add, but I'm having problems. I tried to use this tutorial as a starting point, but I am having a problem that I cannot figure out.

The problem is, when I do a GET for my servlet, I get a 404 error. Here's my config and java fragment rep from controller:

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>SightLogix Coordination System</display-name>

    <description>SightLogix Coordination System</description>

    <servlet>
        <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>     
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>
                    /WEB-INF/application-context.xml
                    /WEB-INF/application-security.xml
                </param-value>
            </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
        <url-pattern>/slcs/*</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/application-context.xml
            /WEB-INF/application-security.xml
        </param-value>
    </context-param>

    <listener>
        <listener-class>
                org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

      

context.xml applications:

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

    default-init-method="init" default-destroy-method="destroy">

    <mvc:annotation-driven />

    <context:component-scan base-package="top.level" />
</beans>

      

security.xml applications:

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    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.0.xsd
                    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <http>
        <intercept-url pattern="/**" access="ROLE_MANAGER" requires-channel="https" />
        <http-basic />
    </http>

    <authentication-manager>
        <authentication-provider user-service-ref="myUserDetailsService">
            <password-encoder hash="sha"/>
        </authentication-provider>
    </authentication-manager>

    <beans:bean id="myUserDetailsService"
        class="path.to.my.UserDetailsServiceImpl">
    </beans:bean>

</beans:beans>

      

Fragment of the controller class (one of many, but they all essentially look like this :)

@Controller
@RequestMapping("/foo.xml")
public class FooController
{       
    @RequestMapping(method=RequestMethod.GET)
    public void handleGET(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        ...

      

Can anyone tell me what I am doing wrong? Thanks!

+2


a source to share


3 answers


The only thing that is out of place here is that you used the same context config files for both the root webapp context and your servlet context. This is almost guaranteed to be a bad idea and lead to a lot of weird behavior. This could be the cause of your problem.

ContextLoaderListener

is configured with contextConfigLocation

<context-param>

and creates and manages a root WebApplicationContext

.

ServletDispatcherServlet

configured with contextConfigLocation

<init-param>

and creates and manages a servlet WebApplicationContext

.



The root WebApplicationContext

is the parent of the servlet application context, i.e. any beans in the root directory WebApplicationContext

are visible to those beans in the servlet WebApplicationContext

.

Your first step should be to separate these configurations. Correct beans in the right places (e.g. all MVC stuff must go in the context of a servlet). Don't split bean definitions between them, they just get confused and / or broken.

+3


a source


This doesn't answer your question directly, but I've always found it helpful to enable debug logging in Spring when I can't figure out what's going wrong.

Below are the two that I usually use in my logging.properties file:



org.springframework.beans.factory.support.level=FINEST
org.springframework.security.level=FINEST

      

0


a source


Do you have more than one GET RequestMapping

in your controller? If there are multiple, and there is ambiguity in resolving them to a specific request, then Spring does not match any of the ambiguous GET mappings.

0


a source







All Articles