Spring MVC POST not supportet

Moinsn

Mitglied
Moinsn,

ich möchte ein existierendes Webflow JSF- Primefaces Projekt um spring mvc via UrlBasedViewResolver erweitern um lesbare urls zu bekommen.
Dummerweise bekomme ich eine
[WR]WARN PageNotFound:183 - Request method 'POST' not supported[/WR]
Warnung wenn mein Suchformular eine ajax oder btn action feuert.
Das zugehörige @ManagedBean wird nicht aufgerufen und der Browserresponse lautet
[WR]HTTP ERROR 405 Problem accessing /app/WEB-INF/views/suche.xhtml. Reason: Request method 'POST' not supported[/WR]

anbei der code:

web.xml:
[XML]
<display-name>My Transport</display-name>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:res/conf/applicationContext.xml</param-value>
</context-param>

<context-param>
<param-name>javax.faces.DEFSULT_SUFFIX</param-name>
<param-value>.xhtml.xml</param-value>
</context-param>

<context-param>
<param-name>faceslets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>

<context-param>
<param-name>javax.faces.FACELETS_RESOLVER_REFRESH_PERIOD</param-name>
<param-value>1</param-value>
</context-param>

<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>hot-sneaks</param-value>
</context-param>

<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>Resources Servlet</servlet-name>
<servlet-class>org.springframework.js.resource.ResourceServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Resources Servlet</servlet-name>
<url-pattern>/resources/*</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>

<servlet>
<servlet-name>Push Servlet</servlet-name>
<servlet-class>org.primefaces.push.PushServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Push Servlet</servlet-name>
<url-pattern>/primepush/*</url-pattern>
</servlet-mapping>

<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter>
<filter-name>NoSessionIdFilter</filter-name>
<filter-class>dev.le.tools.servlet.filter.SessionIdFromUrlRemoveFilter</filter-class>
</filter>

<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<!-- Spring security filters -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter>
<filter-name>charEncodingFilter</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-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>mvc-dispatcher</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>charEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>NoSessionIdFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>[/XML]

applicationContext.xml:
[XML]<context:annotation-config />
<context:component-scan base-package="de************" />
<context:component-scan base-package="de************" />

<import resource="datasource-config.xml" />
<import resource="webflow-config.xml" />
<import resource="security-config.xml" />


<mvc:annotation-driven />
<mvc:resources location="/WEB-INF/views/" mapping="/WEB-INF/views/**"/>


<bean id="defaultServletHttpRequestHandler"
class="org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler" />


<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />

<!-- JSF for representation layer. All JSF files under /WEB-INF/views directory -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="cache" value="false" />
<property name="viewClass" value="org.springframework.faces.mvc.JsfView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".xhtml" />
</bean>

<bean id="userAuthenticationProvider" class="de.wiegand.mytransport.services.impl.UserAuthenticationProvider">
<property name="authenticationManager" ref="authenticationManager" />
</bean>[/XML]

webflow-config.xml:
[XML]<bean id="jpaFlowExecutionListener"
class="org.springframework.webflow.persistence.HibernateFlowExecutionListener">
<constructor-arg ref="sessionFactory" />
<constructor-arg ref="transactionManager" />
</bean>

<bean id="facesContextListener"
class="org.springframework.faces.webflow.FlowFacesContextLifecycleListener" />


<webflow:flow-executor id="flowExecutor">
<webflow:flow-execution-repository
max-executions="0" />
<webflow:flow-execution-listeners>
<webflow:listener ref="facesContextListener" />
<webflow:listener ref="securityFlowExecutionListener" />
</webflow:flow-execution-listeners>
</webflow:flow-executor>

<webflow:flow-registry id="flowRegistry" flow-builder-services="facesFlowBuilderServices" base-path="/WEB-INF/flows">
<webflow:flow-location-pattern value="/**/*-flow.xml" />
</webflow:flow-registry>

<faces:flow-builder-services id="facesFlowBuilderServices"
development="true" />

<faces:resources />

<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
<property name="order" value="0" />
<property name="flowRegistry" ref="flowRegistry" />
<property name="flowUrlHandler">
<bean class="de.wiegand.mytransport.ui.util.PrettyFlowUrlHandler" />
</property>
</bean>



<bean id="faceletsViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.faces.mvc.JsfView" />
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".xhtml" />
</bean>

<bean class="org.springframework.faces.webflow.JsfFlowHandlerAdapter">
<property name="flowUrlHandler">
<bean class="de.wiegand.mytransport.ui.util.PrettyFlowUrlHandler" />
</property>
<property name="flowExecutor" ref="flowExecutor" />
</bean>

<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<property name="flowUrlHandler">
<bean class="de.wiegand.mytransport.ui.util.PrettyFlowUrlHandler" />
</property>
<property name="flowExecutor" ref="flowExecutor" />
</bean>


<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

<bean id="securityFlowExecutionListener"
class="org.springframework.webflow.security.SecurityFlowExecutionListener" />[/XML]

search.xhtml:
HTML:
<p:fieldset styleClass="fieldset_search" legend="Fahrt suchen">
        <h:form id="searchTripForm">
            <p:focus />
            <h:panelGrid id="searchPanelGrid"
                style="margin: 0 auto; margin-top: 25px; text-align: right"
                cellspacing="8" columns="3">
                <h:panelGroup>
                    <h:outputText value="Von:" />
                    <h:outputText style="color:red" value="*  " />
                </h:panelGroup>
                <p:autoComplete id="origin_autocomplete" minQueryLength="3"
                    rendered="#{empty searchBean.notUniqueOrigins}"
                    forceSelection="false" queryDelay="300" maxResults="5"
                    placeholder="PLZ, Stadt oder Statdtteil" charset="UTF-8"
                    value="#{searchBean.originDisplayNameAndClearGeoLocation}"
                    required="true" label="Von" title="Absendeadresse eingeben"
                    tabindex="false"
                    completeMethod="#{geoNamesService.getGeoNamesByInput}" />
                <h:panelGrid rendered="#{!empty searchBean.notUniqueOrigins}"
                    columns="1">
                    <h:selectOneMenu
                        value="#{searchBean.selectedNotUniqueOriginId}"
                        style="width:200px;" onchange="submit()"
                        valueChangeListener="#{searchBean.changeSelectedOrigin}">
                        <f:selectItems value="#{searchBean.notUniqueOrigins}"
                            var="origin" itemLabel="#{origin.name}, #{origin.zipcode}"
                            itemValue="#{origin.id}" />
                    </h:selectOneMenu>
                    <p:commandLink id="resetOriginToInput" style="margin-right:20px;"
                        immediate="true" ajax="false" action="resetOriginToInput">
                        <h:outputText value="zurücksetzen" />
                    </p:commandLink>
                </h:panelGrid>
                <h:panelGroup>
                    <p:message id="originMsg" for="origin_autocomplete" />
                    <p:tooltip for="origin_autocomplete" styleClass="tooltip"
                        showEvent="focus" hideEvent="blur" />
                </h:panelGroup>
                <h:panelGroup>
                    <h:outputText value="Nach:" />
                    <h:outputText style="color:red" value="*  " />
                </h:panelGroup>
                <p:autoComplete id="destination_autocomplete" minQueryLength="3"
                    queryDelay="300"
                    rendered="#{empty searchBean.notUniqueDestinations}"
                    forceSelection="false" charset="UTF-8" maxResults="5"
                    placeholder="PLZ, Stadt oder Statdtteil"
                    value="#{searchBean.destinationDisplayNameAndClearGeoLocation}"
                    effect="fade" required="true" label="Nach"
                    title="Empfängeradresse eingeben"
                    completeMethod="#{geoNamesService.getGeoNamesByInput}" />
                <h:panelGrid
                    rendered="#{!empty searchBean.notUniqueDestinations}"
                    columns="1">
                    <h:selectOneMenu
                        value="#{searchBean.selectedNotUniqueDestinationId}"
                        style="width:200px;" onchange="submit()"
                        valueChangeListener="#{searchBean.changeSelectedDestination}">
                        <f:selectItems value="#{searchBean.notUniqueDestinations}"
                            var="destination"
                            itemLabel="#{destination.name}, #{destination.zipcode}"
                            itemValue="#{destination.id}" />
                    </h:selectOneMenu>
                    <p:commandLink id="resetDestinationToInput" ajax="false"
                        immediate="true" style="margin-right:20px;"
                        action="resetDestinationToInput">
                        <h:outputText value="zurücksetzen" />
                    </p:commandLink>
                </h:panelGrid>

                <h:panelGroup>
                    <p:message id="destinationMsg" for="destination_autocomplete" />
                    <p:tooltip for="destination_autocomplete" styleClass="tooltip"                      showEvent="focus" hideEvent="blur" />
                </h:panelGroup>

            </h:panelGrid>

SucheController:
Java:
@RequestMapping(value="/", method=RequestMethod.GET)
public ModelAndView init() {

    ModelAndView mav = new ModelAndView("suche*");
    return mav; 
}   
@RequestMapping(value="/suche*", method = RequestMethod.GET)
public ModelAndView search(HttpServletRequest request) {
    ModelAndView mav = new ModelAndView("views/suche");
    return mav; 
}
    @RequestMapping(value="/suche*", method = RequestMethod.POST)
public ModelAndView _search(SearchRequestBean searchBean, Model model) {
    ModelAndView mav = new ModelAndView("views/suche");
    return mav; 
}
    @RequestMapping(value="/detail*", method=RequestMethod.GET)
public ModelAndView detail() {

    ModelAndView mav = new ModelAndView("views/detail");
    return mav; 
}

DANKE
 
Sorry, kann dazu keine qualifizierte Auskunft geben. Vielleicht ein paar Punkte zum Abchecken:

  • Ich nehme an, die Spring-Controller-Klasse funktioniert an und für sich, also @Controller steht dran, mappings tauchen im log auf.
  • Ist
    Code:
    /app/WEB-INF/views/suche.xhtml
    der Endpunkt des Controllers? Oder wird da versucht, statischen Content auszuliefern, weil das RequestMapping nicht stimmt?
  • Hat mit dem Problem wahrscheinlich nichts zu tun, sieht aber äußerst verdächtig aus:
    Code:
    <context-param>
        <param-name>javax.faces.DEFSULT_SUFFIX</param-name>
        <param-value>.xhtml.xml</param-value>
    </context-param>
    . Sollte javax.faces.DEFAULT_SUFFIX lauten, oder?. Und
    Code:
    .xhtml.xml
    ist auch gewollt?
 
Zuletzt bearbeitet:

Zurück
Oben