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.
Dzięki za odpowiedź. Odpowiedzią było dodanie @ResponseBody. Wiosna wydaje się dobrze zarządzać nieważnymi zwrotami. –
@AdamDavies zamieść go jako odpowiedź i oznaczyć jako zaakceptowane –