L'envoi de JSON pour contrôleur Spring MVC
Je suis en train d'envoyer JSON à un Contrôleur Spring MVC. Sur le Spring MVC côté, tout est correctement configuré.
Ci-dessous est le code, mais ne semble pas fonctionner:
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
$('#myForm').on('submit', function(e) {
e.preventDefault();
var frm = $("#myForm");
var dat = frm.serialize();
$.ajax({
type: 'POST',
url: $('#myForm').attr('action'),
data: dat,
contentType: 'application/json'
success: function(hxr) {
alert("Success: " + xhr);
}
});
});
</script>
</head>
<body>
<h2>Application</h2>
<form id="myForm" action="/application/save" method="POST" accept="application/json" onclick="i()">
<input type="text" name="name" value="myName">
<input type="submit" value="Submit">
</form>
Dans Tomcat j'obtiens l'erreur suivante:
org.springframework.web.servlet.mvc.de soutien.DefaultHandlerE
xceptionResolver handleNoSuchRequestHandlingMethod
AVERTISSEMENT: ne correspond Aucune méthode de gestionnaire d'trouvé pour le servlet demande: chemin '/application/enregistrer", la méthode "POST", les paramètres de la carte['nom' -> tableau['nomutilisateur']]
Des idées où je vais mal? Je suis nouveau en JSON. Je suis en train d'envoyer JSON à Spring MVC contrôleur.
@Controller
@RequestMapping("/run/*")
public class HistoryController {
@RequestMapping(value = "save", method = RequestMethod.POST, headers = {"content-type=application/json"})
public @ResponseBody Response save(@RequestBody User user) throws Exception {
Response userResponse = new Response();
System.out.println("UserId :" + " " + user.getName());
return userResponse;
}
}
@RequestMapping(value = "find", method = RequestMethod.GET)
public @ResponseBody Response find() {
System.out.println("Run");
Response userResponse = new Response();
userResponse.setVersionNumber("1.0");
return userResponse;
}
Lors de l'appel d' /application/exécuter/enregistrer-je obtenir une réponse JSON. Cependant, l' @RequestBody ne fonctionne pas.
J'ai toujours pas eu de chance. Avoir lu certains nombre de problèmes similaires. L'exigence est que le serveur n'acceptera application/json types. Je suis à l'aide d'un Contrôleur Spring MVC. Comme mentionné précédemment, le code renvoie une réponse JSON via @ResponseBody. Je veux obtenir des informations via @RequestBody dans mon Contrôleur Spring MVC. Je suis à l'aide de JSP pour envoyer JSON à Spring MVC Contrôleur. Mon code et Spring MVC peut être vu ci-dessous:
Je suis nouveau sur le JSON et Javascript.
JSP - index.jsp
<%@page language="java" contentType="text/html"%>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
$('#myForm').on('submit', function(e) {
var frm = $("#myForm");
var dat = JSON.stringify(frm.serializeArray());
$.ajax({
type: 'POST',
url: $('#myForm').attr('action'),
data: dat,
contentType: 'application/json',
dataType: 'json',
error: function() {
alert('failure');
}
success: function(hxr) {
alert("Success: " + xhr);
}
});
);
};
</script>
</head>
<body>
<h2>Application</h2>
<form id="myForm" action="/application/save" method="POST" accept="application/json" onclick="i()">
<input type="text" name="userId" value="User">
<input type="submit" value="Submit">
</form>
</body>
</html>
Lors de l'exécution de ce que je n'obtiens pas de sortie. Dans le Chrome-je obtenir de l'erreur 404 not found et dans Tomcat j'obtiens l'erreur suivante:
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver handleNoSuchRequestHandlingMethod
WARNING: No matching handler method found for servlet request: path '/application/sa
ve', method 'POST', parameters map['userId' -> array<String>['User']]
Est quelque chose de mal ici, dans la page JSP partie?
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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_5.xsd"
version="2.5">
<display-name>WebApp</display-name>
<context-param>
<!-- Specifies the list of Spring Configuration files in comma separated format.-->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/service.xml</param-value>
</context-param>
<listener>
<!-- Loads your Configuration Files-->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>application</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>application</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
service.xml
<?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:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="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
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<context:component-scan base-package="com.web"/>
<mvc:annotation-driven/>
<context:annotation-config/>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean id="jacksonMessageChanger" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json"/>
</bean>
<!-- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jacksonMessageChanger"/>
</list>
</property>
</bean>-->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<util:list id="beanList">
<ref bean="jacksonMessageChanger"/>
</util:list>
</property>
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"/>
</map>
</property>
</bean>-->
</beans>
Contrôleur
package com.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RequestBody;
import com.webchannel.domain.User;
import com.webchannel.domain.UserResponse;
@Controller
@RequestMapping("/application/*")
public class SaveController {
@RequestMapping(value = "save", method = RequestMethod.POST, headers = {"content-type=application/json"})
public @ResponseBody UserResponse save(@RequestBody User user) throws Exception {
UserResponse userResponse = new UserResponse();
System.out.println("UserId :" + " " + user.getUserId());
return userResponse;
}
@RequestMapping(value = "delete", method = RequestMethod.GET)
public @ResponseBody UserResponse delete() {
System.out.println("Delete");
UserResponse userResponse = new UserResponse();
userResponse.setSuccess(true);
userResponse.setVersionNumber("1.0");
return userResponse;
}
}
Lors de l'appel d' /application/supprimer-je obtenir JSON retourné. Donc je sais que mon JacksonProcessor est configuré correctement. Le problème est dans @RequestBody.
Où vais-je tort? S'il vous plaît aider moi.
- dans votre code, vous ne semblent pas être de faire quelque chose avec créé
dat
. N'est-ce pas? - doit-il donc dans mon <form> tag dois-je avoir un paramètre, appelé <input type="nom">?
- Ok, j'ai modifié. Veuillez voir ci-dessus et laissez-moi savoir où je vais mal. Il ne fonctionne toujours pas.
- Pouvez-vous essayer de remplacer
$(function i() {
avecfunction i() {
et});</script>
avec}</script>
? - J'ai essayé cette. Il ne fonctionne toujours pas. Vous ne savez pas quoi faire. J'ai ajouté ce qui suit: type: 'POST', url: 'localhost:8080/application/run', data: dat Essentiellement les et les virgules
- Veuillez voir les changements ci-dessus.
- Exactement pourquoi voulez-vous envoyer JSON? Quel est le béton à l'exigence fonctionnelle? Ne que Spring MVC contrôleur de n'accepter qu'un corps de la requête au format JSON au lieu de la norme
application/x-www-form-urlencoded
comme des formulaires standard et standard requêtes ajax envoyer? Concrètement, votre problème suggère que le contrôleur Spring MVC ne pas accepter un corps de la requête au format JSON à tous. Utilisez simplementvar dat = frm.serialize();
de la manière habituelle, puis.
Vous devez vous connecter pour publier un commentaire.
Cette question est un peu difficile à suivre car il semble y avoir quelques problèmes différents.
Mais en regardant juste à ce problème:
Dans le code HTML que vous avez posté, vous avez un
<form>
qui est mis àPOST
à/application/run
.Cependant, dans votre
@Controller
classe, vous n'avez plus de méthode lié à cette URL.Parce que vous avez annoté de la classe avec
@RequestMapping("/run/*")
et la méthode annotée avec@RequestMapping("save")
, lesave()
méthode est en fait lié à l'URL/run/save
- qui n'est ni l'URL que vous envoyez les données avec$.ajax()
ni l'URL de la forme de la montre.Je suggère de tourner l'enregistrement sur le
org.springframework.web
enregistreurs deDEBUG
- lorsque l'application démarre, le Printemps du journal, toutes les URL que chaque méthode est mappé.*
dans le@RequestMapping(/application/*)
. Avez-vous de prendre ma suggestion pour activer l'enregistrement pour examiner exactement les méthodes qui sont liés à exactement qui les Url?Je pense que vous pouvez avoir besoin de faire quelques changements
Depuis votre contrôleur a
@RequestMapping("/run/*")
, vous devrez peut-être changer ce@RequestMapping("/run/")
et dans la page jsp forme d'action que vous pourriez avoir besoin de changer<form id="myForm" action="/application/run/save" method="POST" accept="application/json" onclick="i()">
, puisque vous avez défini@RequestMapping(value = "save", method = RequestMethod.POST, headers = {"content-type=application/json"})
pour le "sauver" de la méthode dans le contrôleur.Vous devrez peut-être définir l' @RequestParam dans la méthode save controller comme
public @ResponseBody Response save(@RequestParam(required=true, value="name") String name, @RequestBody User user) throws Exception {...}
Puisqu'il dit clairement qu'il n'y a pas de gestionnaire joint à la demande que vous soumettez.
Essayez ce qui suit
La
dataType:'json'
est de spécifier ce que le format que vous attendez du serveur,Et il serait mieux pour vous aider si vous postez votre code de gestionnaire d'.
hxr
faute de frappe (ce qui est après tout aussi mal nommée variable par le façon, il ne représente pas leXMLHttpRequest
objet).Il n'y a pas de méthode dans le contrôleur connecté à votre
/application/run
. Je ne suis pas sûr que l'on vous voulez l'appeler, mais à laurl
vous devez ajouterfind
ousave
. Ou de créer une méthode mappé à/application/run
. Cheers!