2014-11-04 64 views
0

我有一個Spring MVC應用程序運行在Spring框架3.2上,現在我將它移動到Spring MVC 4.1。一切都很好,除了jQuery 1.7.2 Ajax/Json調用獲取「404 Not Found」錯誤頁面。Spring 4.1 MVC不派發我的Ajax Json調用到我的控制器方法404未發現錯誤發生

配置爲:web.xml中

<listener> 
    <listener-class> 
     org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
</listener> 
<listener> 
    <listener-class> 
     org.springframework.web.context.request.RequestContextListener 
    </listener-class> 
</listener> 
<filter> 
    <description>generated-persistence-filter</description> 
    <filter-name>postgresql41Filter</filter-name> 
    <filter-class> 
     org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter 
    </filter-class> 
    <init-param> 
     <param-name>entityManagerFactoryBeanName</param-name> 
     <param-value>postgresql41</param-value> 
    </init-param> 
</filter> 
<filter> 
    <description>generated-sitemesh-filter</description> 
    <filter-name>Sitemesh Filter</filter-name> 
    <filter-class> 
     com.opensymphony.module.sitemesh.filter.PageFilter 
    </filter-class> 
</filter> 

web的context.xml中爲:

<bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" /> 

<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/pages/" /> 
</bean> 

<bean id="iPhoneUserAgentViewResolver" class="org.skyway.spring.util.viewresolution.UserAgentViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="agentSubstring" value="iPhone" /> 
    <property name="prefix" value="/WEB-INF/iphone/" /> 
    <property name="order" value="0" /> 
</bean> 

Controller類如:

@Controller("FirmController") 
@ResponseBody 
public class FirmController { 
/*Added by CheckABNfromABR*/ 
@RequestMapping(value="/checkAbnbyAbr", method=RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) 
public @ResponseBody String checkAbnbyAbr(@RequestParam("abn") String abn, HttpServletRequest request, HttpServletResponse response, Locale locale, Model model) throws IOException{ 
    /*ObjectMapper mapper = new ObjectMapper();*/ 
    /*AbnInfo requesInfo = mapper.readValue(json, AbnInfo.class);*/ 
    AbnInfo abnInfo = new AbnInfo(); 
    abnInfo.setAbn(abn); 

    String viewName = "Success"; 
    if (viewName.equalsIgnoreCase("Success")) 
     abnInfo.setValidation("Success"); 
    else 
     abnInfo.setValidation("Error"); 
    return toJson(abnInfo); 
} 
} 

JavaScript代碼爲:

function checkAjaxCall(inabn){ 
/*var name = $('#name').val(); 
var location = $('#location').val(); */ 
/*var json = {"name" : name,"location" : location}; */ 
/*var json = {"abn" : inabn};*/ 
jQuery.ajax({ 
    url: "checkAbnbyAbr", 
    type: 'GET', 
    data: "abn="+inabn, 
    dataType: "json", 
    /*cache: false,*/ 
    async: false, 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader("Accept", "application/json"); 
     xhr.setRequestHeader("Content-Type", "application/json"); 
    }, 
    success:function(response){ 
     /*alert("Validation: "+response.validation+" Name: "+response.name+" Location: "+response.location);*/ 
     console.log("Validation: "+response.validation+"|"); 
    }, 
    error:function(jqXhr, textStatus, errorThrown){ 
     alert(textStatus); 
    } 
}); 
return true; 
}; 

請求頭的螢火:

Accept application/json 
Accept-Encoding gzip, deflate 
Accept-Language en-US,en;q=0.5 
Content-Type application/json 
Cookie JSESSIONID=55AD33FFBF4524926A53C660FA734F01 
Host localhost:8080 
Referer http://localhost:8080/OZSSCMEMAC/newFirm 
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:33.0) Gecko/20100101 Firefox/33.0 
X-Requested-With XMLHttpRequest 

響應頭的螢火:

內容語言烯 內容長度1042 內容類型文本/ HTML;字符集= UTF-8 日期星期二, 2014年11月4日0點14分43秒GMT 服務器Apache的狼/ 1.1

我設置log4j.properties以支持調試狀態的Spring應用程序,我得到了一些服務器信息:

2014-11-04 10:14:43,524 DEBUG [http-nio-8080-exec-34] OpenEntityManagerInViewFilter - Opening JPA EntityManager in OpenEntityManagerInViewFilter 
2014-11-04 10:14:43,524 DEBUG [http-nio-8080-exec-34] OpenEntityManagerInViewFilter - Opening JPA EntityManager in OpenEntityManagerInViewFilter 
2014-11-04 10:14:43,524 DEBUG [http-nio-8080-exec-34] OpenEntityManagerInViewFilter - Closing JPA EntityManager in OpenEntityManagerInViewFilter 
2014-11-04 10:14:43,524 DEBUG [http-nio-8080-exec-34] OpenEntityManagerInViewFilter - Closing JPA EntityManager in OpenEntityManagerInViewFilter 
2014-11-04 10:14:43,524 DEBUG [http-nio-8080-exec-34] EntityManagerFactoryUtils - Closing JPA EntityManager 
2014-11-04 10:14:43,524 DEBUG [http-nio-8080-exec-34] EntityManagerFactoryUtils - Closing JPA EntityManager 

似乎Ajax/Json請求由OpenEntityManagerInViewFilter處理,處理程序未找到正確的Controller方法。

我相信在配置文件中有一些配置錯過了,我沒有發現從谷歌的任何東西的Spring 4.1 Ajax/JSON調用配置。

任何人都有這種經驗,請指教!

回答

1

您錯過了您的Dispatcher Servlet,它將請求映射到控制器。它是在你的web.xml定義如下:

<servlet> 
     <servlet-name>action</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>debug</param-name> 
      <param-value>true</param-value> 
     </init-param> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value> 
       /WEB-INF/action-servlet.xml 
      </param-value> 
     </init-param> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 

<servlet-mapping> 
     <servlet-name>action</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

在你action-servlet.xml文件,你需要指定:

<tx:annotation-driven/> 
    <mvc:annotation-driven/> 
    <context:component-scan base-package="your.package"/> 
    <context:annotation-config/> 
+0

感謝您點了正確的方向。實際上,Spring 3.1與Spring 3.1完全不同。我必須明確指定我們web.xml中的每個請求映射servlet-mapping如add: – 2014-11-08 05:37:27

相關問題