415 non pris en charge Type de Média avec le Printemps 3.2
J'essaie d'insérer et/ou de mise à jour des données dans la base de données à l'aide de la PUT
méthode via JSON à l'aide de jQuery 1.6, (Jackson 2.1.1 et le Printemps 3.2.0).
Le code JS est comme suit.
var itemsArray=[];
var id;
function insertOrUpdate()
{
var i=0;
$('input[name="txtCharge[]"]').each(function()
{
isNaN($(this).val())||$(this).val()==''?itemsArray[i][2]='':itemsArray[i][2]=$(this).val();
i++;
});
$.ajax({
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
datatype:"json",
type: "PUT",
url: "/wagafashion/ajax/InsertZoneCharge.htm",
data: "items=" + JSON.stringify(itemsArray)+"&zoneId="+id+"&t="+new Date().getTime(),
success: function(response)
{
alert(response);
},
error: function(e)
{
alert('Error: ' + e);
}
});
}
La méthode à l'intérieur du Ressort du contrôleur qui est mappé avec l'URL est comme suit.
@RequestMapping(value=("ajax/InsertZoneCharge"), method=RequestMethod.PUT, produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String insertZoneCharge(@RequestBody final MultiValueMap<String, String > data, final HttpServletResponse response, HttpServletRequest request)
{
String message="";
try
{
Map<String, String> params = data.toSingleValueMap();
if(params.get("zoneId")==null||params.get("zoneId").equals("")||params.get("items")==null||params.get("items").equals(""))
{
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
}
else
{
message=zoneChargeService.insertZoneCharge(params.get("zoneId"), params.get("items"));
}
}
catch (IOException ex)
{
message="An error occured. Data can not be saved.";
Logger.getLogger(ZoneCharge.class.getName()).log(Level.SEVERE, null, ex);
}
return message;
}
Le serveur répond que la question implique,
415 Unsupported Media Type
Les informations d'en-tête se présente comme suit.
Request URL:http://localhost:8080/wagafashion/ajax/InsertZoneCharge.htm
Request Method:PUT
Status Code:415 Unsupported Media Type
Request Headersview source
Accept:application/json
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:352
Content-Type:application/json
Cookie:JSESSIONID=72AAFCC832C29D14FFA937D00D428A81
Host:localhost:8080
Origin:http://localhost:8080
Referer:http://localhost:8080/wagafashion/admin_side/ZoneCharge.htm
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17
X-Requested-With:XMLHttpRequest
Request Payload
items=[[1,10,"12.35"],[2,10.5,"16.00"],[3,11,"20.00"],[4,11.5,"30.00"],[5,12,"40.00"],[6,12.5,"50.00"],[7,13,"60.00"],[8,13.5,"70.00"],[9,14,""],[10,14.5,""],[11,15,""],[12,15.5,""],[13,16,""],[14,16.5,""],[15,17,""],[16,17.5,""],[17,18,""],[18,18.5,""],[19,19,""],[20,19.5,""],[24,20,""],[25,20.5,""],[26,21,""],[41,21.5,""]]&zoneId=45&t=1359485680332
Response Headersview source
Content-Length:1048
Content-Type:text/html;charset=utf-8
Date:Tue, 29 Jan 2013 18:54:40 GMT
Server:Apache-Coyote/1.1
L'ensemble de la dispatcher-servlet.xml
fichier est comme suit.
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
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.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<context:component-scan base-package="controller" />
<context:component-scan base-package="validatorbeans" />
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" >
<mvc:message-converters register-defaults="false">
<bean id="jacksonMessageConverter"
p:supportedMediaTypes="application/json"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
<property name="favorParameter" value="false" />
<property name="ignoreAcceptHeader" value="false" />
<property name="mediaTypes" >
<value>
atom=application/atom+xml
html=text/html
json=application/json
*=*/*
</value>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="index.htm">indexController</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<bean name="indexController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController"
p:viewName="index" />
</beans>
Il fonctionne lorsque je supprime @RequestBody final MultiValueMap<String, String > data
, un paramètre d'une méthode et d'utiliser simplement @PathVariable
pour accepter les paramètres de la demande.
<property name="defaultContentType" value="application/json" />
, ou si vous supprimez register-defaults="false"
de <mvc:message-converters register-defaults="false">
?Essayé les deux façons ne fonctionne toujours pas malheureusement.
Voir aussi les commentaires à CodeChimp la réponse!
Ainsi suis-je traiter avec mal de demande de charge utile?
Ci-dessus,
data: "items=" + JSON.stringify(itemsArray)+"&zoneId="+id+"&t="+new Date().getTime()
n'est en effet pas JSON. Ainsi, la valeur de items
est JSON, mais la pleine charge elle-même a plusieurs paramètres, comme items
et zoneId
et n'est pas pure JSON. C'est très bon si vous faites de l'envoyer comme application/x-www-form-urlencoded
bien (ce qui est le jQuery par défaut). En passant, notez que vous pouvez aussi avoir jQuery créer le contenu pour vous: {items: ..., id: ...}
.
OriginalL'auteur Tiny | 2013-01-29
Vous devez vous connecter pour publier un commentaire.
Le type de contenu que le navigateur envoie,
Content-Type: application/json
, ne semblent pas correspondre@RequestBody final MultiValueMap<String, String > data
.:
Envoyer
application/x-www-form-urlencoded
(auquel cas, vous pouvez faciliter l'utilisation HttpPutFormContentFilter à la place).Ou: changer cela en quelque chose comme
@RequestBody final MyDTO data
comme expliqué dans JQuery, Spring MVC @RequestBody et JSON - faire fonctionner ensemble....mais je me doute que tu l'ai testé rapidement?
Oui il a travaillé. Un nouveau test pour la fourniture de certaines données d'entrée et les attendus des modifications ont été apportées à la base de données. Merci.
Pourriez-vous m'aider sur ce stackoverflow.com/questions/18102452/...
OriginalL'auteur Arjan
J'ai eu le même problème, la solution a été de retirer @RequestBody, puis en prenant les données de la demande (avec IOUtils de apache commons). Il convient de noter que j'ai utilisé les données reçues juste pour la journalisation des erreurs js.
Le bénéfice d'au moins essayer, c'est que si le 415 est due à une désérialisation problème (c'était mon cas) après l'obtention de la demande et d'essayer de désérialiser la question/exception est plus évident.
OriginalL'auteur Juan
Dans le côté serveur, au Printemps les 3, vous avez besoin de ceci:
Printemps 4 utilise
mappingJackson2HttpMessageConverter
.Sans
AnnotationMethodHandlerAdapter
haricot de déclaration, vous pouvez également utiliser@RequestBody
, tout en déclarant que nous pouvons définir desmappingJackson2HttpMessageConverter
àmessageConverters
. C'est conclu par des phénomènes que j'ai observé, si mal s'il vous plaît corriger.OriginalL'auteur Tiina
Je pense que votre navigateur ne prend pas en charge quel que soit votre retour. L'explication d'un HTTP 415 semble l'indiquer. Qu'est-ce que le serveur d'envoi tant que le Type de Contenu dans la réponse?
Accept: application/json
.Selon le W3C: w3.org/Protocols/rfc2616/rfc2616-sec10.html , l'erreur se produit lorsque Le serveur est en refusant de service à la demande, parce que l'entité de la demande est dans un format non pris en charge par la ressource demandée pour la méthode de la requête." Votre demande de charge utile n'est pas au format JSON, mais son dit son Type de Contenu est en JSON. Votre demande de charge utile semble être un standard de publication de formulaires.
Je pense que votre réponse c'est faux, mais dans votre commentaire, vous avez raison à propos de "la charge utile n'est pas au format JSON". Je n'ai même pas remarqué. Je ne suis pas sûr si le Printemps serait alors jetez un 415, ou un 400 voire 500. Je suppose que, même si la charge utile ont été JSON valide, le Printemps ne serait pas correspondre à
@RequestBody final MultiValueMap<String, String>
. (Je peux voir comment il pourrait correspondre vraiment à plat JSON structures, comme dans la base de paires clé-valeur. Mais si c'est juste un peu hiérarchique, alors je sais pas comment le Printemps/Jackson convertir> dans un utilisable?)OriginalL'auteur CodeChimp
Juste au cas où quelqu'un rencontre ce: j'ai eu deux Méthodes
vide setLevel (Niveau)
void setLevel (niveau de Corde)
dans la Classe annotée avec @RequestBody et qui a également causé un 415.
J'ai rencontré ce fil alors que googler le message d'erreur (Le Sujet de la Fpo question) et pensé qu'il pourrait aider d'autres personnes qui trouvent ce fil, je l'ai fait. Donc, fondamentalement, ça ne vous répond que le sujet, non pas l'ensemble de la question.
Dans ce cas, c'est probablement le mieux adapté à être laissé un commentaire sur la question plutôt que de posté une réponse.
Ah ok, la prochaine fois je vais essayer ça.
OriginalL'auteur smakks