problème de configuration d'annotation Spring MVC
-
26-09-2019 - |
Question
Je suis en train d'améliorer mon printemps configuration mvc afin de ne pas exiger un nouveau fichier de configuration pour chaque servlet ajouter, mais je suis en cours d'exécution dans des problèmes. Je l'ai essayé d'utiliser ce tutoriel comme point de départ, mais je suis en cours d'exécution dans un problème que je ne peux pas comprendre.
Le problème est que quand je fais un GET à mon servlet, je reviens d'une erreur 404. Voici ma config et un extrait de java représentant d'un contrôleur:
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>
application 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>
application 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>
Snippet d'une classe de contrôleur (l'un des nombreux, mais ils se ressemblent tous essentiellement comme celui-ci):
@Controller
@RequestMapping("/foo.xml")
public class FooController
{
@RequestMapping(method=RequestMethod.GET)
public void handleGET(HttpServletRequest request, HttpServletResponse response) throws IOException
{
...
Quelqu'un peut-il me dire ce que je fais mal? Merci!
La solution
La seule chose hors de propos ici est que vous avez utilisé les mêmes fichiers de configuration de contexte à la fois le contexte webapp racine et votre contexte de servlet. Ceci est presque garanti d'être une mauvaise idée, et se traduira par beaucoup de comportements bizarres. Cela pourrait bien être la cause de votre problème.
Le ContextLoaderListener
est configuré avec le contextConfigLocation
de <context-param>
, et crée et gère le WebApplicationContext
racine.
Le ServletDispatcherServlet
est configuré avec le contextConfigLocation
de <init-param>
, et crée et gère le servlet WebApplicationContext
.
Le WebApplicationContext
racine est le parent de la servlet appcontext, i.e. des haricots dans le WebApplicationContext
racine sont visibles pour les haricots dans le servlet WebApplicationContext
.
Votre première étape devrait être de séparer ces configurations. Avec les haricots corrects dans les bons endroits (par exemple tous les trucs MVC doit aller dans le contexte de servlet). Ne pas de partager des définitions de haricots entre les deux, il vous reste plus qu'à se confondre et / ou cassé.
Autres conseils
Cela ne répond pas directement à votre question, mais je l'ai toujours trouvé utile pour activer la journalisation de débogage au printemps quand je ne peux pas comprendre ce qui se passe mal.
Voici deux que j'utilise couramment dans mon fichier logging.properties:
org.springframework.beans.factory.support.level=FINEST
org.springframework.security.level=FINEST
Avez-vous plus d'un GET RequestMapping
dans votre contrôleur, par hasard? S'il y a plus d'un et il y a ambiguïté dans les résoudre à une demande particulière Spring ne correspond pas à l'une des correspondances ambiguës GET.