2013-02-25 12 views
10

Mam kontroler Spring, który jest wywoływany z JQuery.post(). Po wywołaniu metoda kontrolera jest wywoływana i zwracana. Ale w tle Spring zmienia adres URL i wywołuje zyski serwera. Serwer odpowiada 404.Kontroler wiosny 404 zresetowany po metodzie POST Wywołany

Myślę, że jest to odpowiedź na Spring próbujący znaleźć widok po przetworzeniu metody POST.

Jak zatrzymać sterowanie sprężyną przed zrobieniem tego.

Oto moja Wiosna Kontroler:

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); 
    } 
} 

Oto moja aplikacja plik xml kontekstu:

<?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> 

Oto mój plik web.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> 

Oto moja Wywołanie JQuery z mojego pliku HTML:

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; 
} 

Funkcja dataSentOK po prostu wykonuje alert("DONE").

Więc gdy metoda JQuery URL wywoływany jest:

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

i po stronie serwera przy System.out.println(...) sposób wydrukować dane zgodnie z oczekiwaniami.

Jednak w Firebug, serwer odsyła 404.

Więc włączony zalogowaniu się wiosną i dostał to:

[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 

W odpowiedzi na żądanie POST (URL/jQuery/data/person/put), została znaleziona właściwa metoda i wywołana (linie od 1 do 7), ale następnie Spring przesyła dalej do InternalResourceView w linii 8, która zmienia adres URL na /jquery/data/person/person/put i nie można tego znaleźć.

Jak zatrzymać wiosnę przed próbą znalezienia widoku w ogóle. Wszystko, co chcę, to powrócić czysto i być zrobione.

Dzięki za pomoc.

Odpowiedz

6

Wierzę, że jeśli masz typ zerowy lub nieważny, Spring spróbuje rozwiązać ten widok na podstawie adresu URL żądania. Myślę, że właściwą formą byłoby po prostu zwrócić stronę OK, ponieważ nie wydaje się to być JSON lub coś podobnego. Lub po prostu otaguj @ResponseBody i zwróć pusty ciąg.

+1

Dzięki za odpowiedź. Odpowiedzią było dodanie @ResponseBody. Wiosna wydaje się dobrze zarządzać nieważnymi zwrotami. –

+2

@AdamDavies zamieść go jako odpowiedź i oznaczyć jako zaakceptowane –

11

Rozwiązany.

Problem był taki, jak zasugerowałem #CodeChimp, z tym że nadal chciałem uzyskać typ zwrotu pustki.

dodałem @ResponseBody do metody addPerson i wszystko działało w porządku:

@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); 
} 

Wskazówkę pochodzi http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-responsebody.Chociaż dokumentacja nie jest jasna, co dzieje się z pustym powrotem. Wypróbowałem to i zadziałało.

+0

Zgaduję, że void lub zerowy powrót będą działać tak samo, jak pusty ciąg. Wiosna po prostu nie zawierałaby nic w ciele odpowiedzi. Uważam, że ludzie z Spring są całkiem sprytni i mają tendencję do myślenia o wszystkich możliwych kątach w swoich rozwiązaniach. – CodeChimp

Powiązane problemy