Search code examples
javaspring-mvcmethodsrequest-mapping

Controller @RequestMapping error URLs


My application doesn't work with requestmapping, the request always works with the same method handleRequest, the controller is RestController.java and the URLs redirects to it when has the path /REST2/*, it works well but always with the same method. But the method "update" never works when I send the request to locahost:9080/myapp/REST2/rrr and if I change the URL i.e. localhost:9080/myapp/REST2/XXX also the request is going to handleRequest method.

The RequestMapping doesn't work well, I tried with other solutions but doesn't work..

Do you have any idea?

Restcontroller.java

public class RestController implements Controller{
private Configuration config;
private static String[] requestHeaders = {"accept", "pragma"};
private static String[] responseHeaders = {};    

public void setConfig(Configuration config)
{
    this.config = config;
}


@RequestMapping(value="/rrr") public ModelAndView update(HttpServletRequest request, HttpServletResponse response) throws Exception 
     {

    String asset_name = request.getParameter("assetid");
     response.setContentType("text/plain");  // Set content type of the response so that jQuery knows what it can expect.
     response.setCharacterEncoding("UTF-8"); // You want world domination, huh?

     String values = "Working"+ asset_name;
     response.setContentLength(values.length());

     PrintWriter out = response.getWriter();

    out.println(values);
    return null;

}

@RequestMapping(value ="/home")public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception 
{
    Arrays.sort( requestHeaders );
    Arrays.sort( responseHeaders );
    String values;

    String asset_name = request.getParameter("assetid");
    ...
   response.setContentLength(values.length());
    //
    PrintWriter out = response.getWriter();

    out.println(values);


    return null;
}}

spring-servlet.xml

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

  <!-- View resolver. Prepends prefix /WEB-INF/jsp and suffix .jsp to view names. -->
  <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
  </bean>

  <!-- Always use full path when mapping URLs to bean names. -->
  <bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    <property name="alwaysUseFullPath" value="true" />
  </bean>

  <!-- Home page. -->
  <bean name="/home.app" class="com.fatwire.wem.sample.HomeController">
    <property name="config" ref="config" />
  </bean>  
  <!-- Installation page. -->
  <bean name="/install.app" class="com.fatwire.wem.sample.InstallController">
    <property name="config" ref="config" />
  </bean>
  <!-- Layout page. -->
  <bean name="/layout.app" class="com.fatwire.wem.sample.LayoutController" />  
  <!-- REST proxy page. -->
  <bean name="/REST/**" class="com.fatwire.wem.sample.ProxyController">
    <property name="config" ref="config" />
  </bean>
    <!-- REST proxy page. -->
  <bean name="/REST2/**" class="com.fatwire.wem.sample.RestController">
    <property name="config" ref="config" />
  </bean>


</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >

  <!-- Bootstrap Spring configuration to be used by both SSO and MVC -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>  

  <!-- WEM SSO Listener -->
  <listener>
    <listener-class>com.fatwire.wem.sso.SSOListener</listener-class>
  </listener>       

  <!-- Configure Spring MVC -->
  <servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>*.app</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/REST/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/REST2/*</url-pattern>
  </servlet-mapping>


  <!-- WEM SOO Filter -->
  <filter>
    <filter-name>WEM SSO Filter</filter-name>
    <filter-class>com.fatwire.wem.sso.SSOFilter</filter-class>
  </filter>  
  <filter-mapping>
    <filter-name>WEM SSO Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

Request AJAX

 function load_form(data){
                var asset_id = data;
                $.post('REST2/home', {
                    assetid : data,

                }, function(responseText) {
                alert(responseText);
                });
    }

    function update_form(){
        var asset_id = "XXX";
        $.post('REST2/rrr', {
            assetid : asset_id,

        }, function(responseText) {
            alert(responseText)



        });

Solution

  • Try to add @Controller and @RequestMapping annotations to RestController classlike this:

      @Controller
      @RequestMapping(value="/REST2")
      public class RestController implements Controller{
    

    And add method=RequestMethod.POST the @RequestMapping of methods like this:

      @RequestMapping(value ="/home", method=RequestMethod.POST)
      ...
      @RequestMapping(value ="/rrr", method=RequestMethod.POST)