2010-05-11 4 views
2

Я пытаюсь улучшить конфигурацию моей весны mvc, чтобы не требовать новый файл конфигурации для каждого добавляемого сервлета, но у меня возникают проблемы. Я попытался использовать this tutorial в качестве отправной точки, но я столкнулся с проблемой, которую я не могу понять.Проблема с конфигурацией аннотаций Spring MVC

Проблема в том, что когда я делаю GET для своего сервлета, я возвращаю ошибку 404. Вот мой конфиг, и репрезентативный ява фрагмент из контроллера:

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:

<?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:

<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> 

Фрагмент класса контроллера (один из многих, но все они выглядят по существу так:

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

Может ли кто-нибудь сказать мне, что я делаю неправильно? Спасибо!

+0

Вы используете /slcs/foo.xml в качестве URL-адреса с HTTPS? –

+0

@ ТейлорЛ: Да, я. – Seth

ответ

3

Единственное неуместны здесь является то, что вы использовали тот же контекст, конфигурационные файлы и для корневого контекста WebAPP и ваш контекст сервлета. Это почти гарантированно будет плохой идеей и приведет к большому странному поведению. Это может быть причиной вашей проблемы.

The ContextLoaderListener сконфигурирован с contextConfigLocation<context-param>, создает и управляет корень WebApplicationContext.

ServletDispatcherServlet сконфигурирован с contextConfigLocation<init-param>, а также создает и управляет сервлетом WebApplicationContext.

Корень WebApplicationContext является родителем сервлета контекста приложения, то есть любые бобы в корне WebApplicationContext могут видеть эти бобы в сервлет WebApplicationContext.

Ваш первый шаг должен состоять в том, чтобы отделить эти конфигурации. С правильными компонентами в правильных местах (например, все материалы MVC должны идти в контексте сервлета). Do не разделяйте определения bean между ними, это просто запутается и/или сломается.

+0

С такой конфигурацией параметр init init сервлетов должен указывать на пустой файл определения bean-компонента - слушатель контекстного загрузчика будет загружать все компоненты, а затем все они будут переопределены самим при загрузке сервлета диспетчера. Хотя я согласен с вами в принципе с разделением материала MVC на конкретные файлы конфигурации сервлета, в этом случае есть только один сервлет, поэтому это действительно не требуется - когда возникают два или более сервлета, это разделение становится более важным. – MetroidFan2002

+0

Я выделил файлы контекста для моего приложения и моих сервлетов, но я все еще получаю эту ошибку 404. – Seth

0

Это не отвечает на ваш вопрос напрямую, но я всегда считал полезным включить ведение журнала отладки весной, когда я не могу понять, что происходит не так.

Ниже приведены два, которые я обычно использую в своей logging.properties файле:

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

У вас есть более одного GET RequestMapping в вашем контроллере, если это возможно? Если их несколько, и существует двусмысленность в разрешении их на конкретный запрос, Spring не сопоставляется ни с одним из двусмысленных GET-сопоставлений.

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