2013-02-25 54 views
10

मेरे पास एक वसंत नियंत्रक है जिसे JQuery.post() से बुलाया जा रहा है। जब इसे नियंत्रक की विधि कहा जाता है तो उसे बुलाया जाता है और लौटाता है। लेकिन फिर, पृष्ठभूमि में, वसंत यूआरएल बदलता है और सर्वर को लाभ देता है। सर्वर 404 के साथ प्रतिक्रिया करता है।पोस्ट विधि के बाद वसंत नियंत्रक 404 पुन: प्रयास किया गया

मुझे लगता है कि यह पोस्ट विधि के संसाधित होने के बाद एक दृश्य खोजने की कोशिश कर वसंत के जवाब में है।

मैं वसंत नियंत्रक को ऐसा करने से कैसे रोकूं।

<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="uk.co.jeeni" /> 

    <mvc:annotation-driven /> 

</beans> 

यहाँ मेरी web.xml फ़ाइल है:

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestBody; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 

import java.util.ArrayList; 
import java.util.List; 

@Controller 
@RequestMapping("/person") 
public class DataController { 

    private List<Person> people = new ArrayList<Person>(); 

    @RequestMapping(value="put", method = RequestMethod.POST) 
    public void addPerson(@ModelAttribute("person") Person person){ 
    System.out.println(">>>>>>> person: " + person); 
    System.out.println(">>>>>>>>> " + person.getFirstName()); 
    people.add(person); 
    } 
} 

यहाँ अपने आवेदन संदर्भ xml फ़ाइल है:

यहाँ मेरी स्प्रिंग नियंत्रक है

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<web-app 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" 
     version="2.4"> 

    <servlet> 
     <servlet-name>dispatcherServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath*:applicationContext-web.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispatcherServlet</servlet-name> 
     <url-pattern>/data/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

यहाँ है मेरी मेरी HTML फ़ाइल से JQuery कॉल:

function attachSendDataEvent(){ 
    $("#sendData").click(function(){ 

     var data = "firstName=" + $("#firstName").val() + "&" + 
       "lastName=" + $("#lastName").val() + "&" + 
       "address=" + $("#address").val() + "&" + 
       "postcode=" + $("#postcode").val(); 

     $.post("data/person/put", 
       data, 
       dataSentOK 
     ); 
    }); 

    return false; 
} 

dataSentOK फ़ंक्शन केवल alert("DONE") करता है।

तो जब JQuery विधि यूआरएल लागू है:

http://localhost:8080/jquery/data/person/put 

और सर्वर साइड System.out.println(...) विधि प्रिंट आउट डेटा के रूप में उम्मीद पर।

हालांकि Firebug में, सर्वर वापस भेजता है एक 404.

तो मैं वसंत के साथ प्रवेश करने पर स्विच और यह मिल गया:

[01] DispatcherServlet [DEBUG] DispatcherServlet with name 'dispatcherServlet' processing POST request for [/jquery/data/person/put] 
[02] AbstractHandlerMethodMapping [DEBUG] Looking up handler method for path /person/put 
[03] AbstractHandlerMethodMapping [DEBUG] Returning handler method [public void uk.co.jeeni.DataController.addPerson(uk.co.jeeni.Person)] 
[04] AbstractBeanFactory [DEBUG] Returning cached instance of singleton bean 'dataController' 
[05] DispatcherServlet [DEBUG] Rendering view [org.springframework.web.servlet.view.InternalResourceView: name 'person/put'; URL [person/put]] in DispatcherServlet with name 'dispatcherServlet' 
[06] AbstractView [DEBUG] Added model object 'org.springframework.validation.BindingResult.person' of type [org.springframework.validation.BeanPropertyBindingResult] to request in view with name 'person/put' 
[07] AbstractView [DEBUG] Added model object 'person' of type [uk.co.jeeni.Person] to request in view with name 'person/put' 
[08] InternalResourceView [DEBUG] Forwarding to resource [person/put] in InternalResourceView 'person/put' 
[09] DispatcherServlet [DEBUG] DispatcherServlet with name 'dispatcherServlet' processing POST request for [/jquery/data/person/person/put] 
[10] AbstractHandlerMethodMapping [DEBUG] Looking up handler method for path /person/person/put 
[11] AbstractHandlerMethodMapping [DEBUG] Did not find handler method for [/person/person/put] 
[12] DispatcherServlet [ WARN] No mapping found for HTTP request with URI [/jquery/data/person/person/put] in DispatcherServlet with name 'dispatcherServlet' 
[13] FrameworkServlet [DEBUG] Successfully completed request 
[14] FrameworkServlet [DEBUG] Successfully completed request 

यूआरएल पोस्ट अनुरोध के जवाब में (/ jQuery/डेटा/व्यक्ति/डाल), सही विधि पाया जाता है और लागू (लाइनों 1 से 7), लेकिन फिर लाइन 8, जो /jquery/data/person/person/put को URL परिवर्तन पर एक InternalResourceView को आगे वसंत, और यह नहीं पाया जा सकता है।

मैं वसंत को एक दृश्य खोजने की कोशिश करने से कैसे रोकूं। मैं बस इतना करना चाहता हूं कि वह साफ हो जाए और किया जाए।

आपकी मदद के लिए धन्यवाद।

उत्तर

6

मेरा मानना ​​है कि अगर आप एक अशक्त या शून्य वापसी प्रकार है, वसंत अनुरोध URL के आधार पर देखने को हल करने की कोशिश करेंगे। मुझे लगता है कि यहां उचित फॉर्म बस एक ओके पेज वापस करना होगा, क्योंकि यह JSON या ऐसा कुछ नहीं प्रतीत होता है। या, बस इसे @ResponseBody के साथ टैग करें और एक खाली स्ट्रिंग वापस करें।

+1

आपकी प्रतिक्रिया के लिए धन्यवाद। जवाब @ResponseBody जोड़ने के लिए था। वसंत शून्य रिटर्न ठीक संभालता प्रतीत होता है। –

+2

@AdamDavies इसे उत्तर के रूप में पोस्ट करें और इसे स्वीकृत –

11

हल हो गया। के रूप में #CodeChimp, सुझाव को छोड़कर मैं अभी भी एक शून्य वापसी प्रकार चाहता था

समस्या थी।

मैं addPerson विधि के लिए @ResponseBody जोड़ा गया है और सब कुछ ठीक काम किया:

@RequestMapping(value="put", method = RequestMethod.POST) 
**@ResponseBody** 
public void addPerson(@ModelAttribute("person") Person person){ 
    System.out.println(">>>>>>> person: " + person); 
    System.out.println(">>>>>>>>> " + person.getFirstName()); 
    people.add(person); 
} 

सुराग http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-responsebody से आया है।हालांकि दस्तावेज स्पष्ट नहीं है कि शून्य वापसी के साथ क्या होता है। बस कोशिश की और यह काम किया।

+0

के रूप में चिह्नित करें, मुझे लगता है कि एक शून्य या शून्य वापसी एक खाली स्ट्रिंग के समान ही काम करेगी। बसंत प्रतिक्रिया शरीर में कुछ भी नहीं डाल देगा। मुझे लगता है कि वसंत लोग इस तरह के बहुत चालाक हैं, और उनके समाधान में सभी संभावित कोणों के बारे में सोचते हैं। – CodeChimp