Spring MVC Anmerkung Konfigurationsproblem
-
26-09-2019 - |
Frage
Ich versuche, meine Feder mvc Konfiguration zu verbessern, um nicht eine neue Konfigurationsdatei für jede Servlet benötige ich hinzufügen, aber ich laufe in Probleme. Ich habe versucht mit dieses Tutorial als Ausgangspunkt, aber ich laufe in ein Problem, dass ich nicht herausfinden kann.
Das Problem ist, dass wenn ich ein GET mein Servlet tun, ich habe einen Fehler 404 zurück. Hier sind meine Config und ein Vertreter Java Schnipsel aus einem 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>
applikations 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>
applikations 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 einer Controller-Klasse (einer von vielen, aber sie sehen alle im Wesentlichen wie folgt):
@Controller
@RequestMapping("/foo.xml")
public class FooController
{
@RequestMapping(method=RequestMethod.GET)
public void handleGET(HttpServletRequest request, HttpServletResponse response) throws IOException
{
...
Kann mir jemand sagen, was ich falsch mache? Dank!
Lösung
Das einzige, was hier fehl am Platz ist, dass Sie beide die gleichen Kontext Konfigurationsdateien für den Kontext root Webapp verwendet haben und Ihr Servlet-Kontext. Dies ist fast garantiert eine schlechte Idee zu sein, und in einer Menge seltsame Verhalten führen. Das kann gut sein, die Ursache des Problems.
Die ContextLoaderListener
wird mit dem contextConfigLocation
<context-param>
konfiguriert, und erzeugt und verwaltet die Wurzel WebApplicationContext
.
Die ServletDispatcherServlet
mit dem contextConfigLocation
<init-param>
konfiguriert und erstellt und verwaltet das Servlet WebApplicationContext
.
Die Wurzel WebApplicationContext
ist die Mutter des Servlets appcontext, d.h irgendwelche Bohnen in der Wurzel WebApplicationContext
auf diese Bohnen in dem Servlet WebApplicationContext
sichtbar sind.
Ihr erster Schritt soll diese Konfigurationen zu trennen sein. Mit den richtigen Bohnen in den richtigen Stellen (zum Beispiel all MVC Zeug muss im Servletkontext gehen). Haben nicht Aktie Bean Definitionen zwischen den beiden, es wird nur erhalten verwirrend und / oder gebrochen.
Andere Tipps
Dies beantwortet Ihre Frage nicht direkt, aber ich habe immer gefunden, es hilfreich die Debug-Protokollierung im Frühjahr zu aktivieren, wenn ich nicht herausfinden kann, was schief läuft.
Im Folgenden sind zwei, dass ich häufig in meiner logging.properties Datei:
org.springframework.beans.factory.support.level=FINEST
org.springframework.security.level=FINEST
Haben Sie mehr als eine GET RequestMapping
in Ihrem Controller durch eine Chance? Wenn es mehr als ein, und es gibt in Mehrdeutigkeit sie auf eine spezielle Anforderung Lösung Frühling nicht zu einem der mehrdeutigen GET-Mappings mappen.