Estoy tratando de enviar una solicitud POST a un servlet. La solicitud se envía a través de jQuery de esta manera:
var productCategory = new Object();
productCategory.idProductCategory = 1;
productCategory.description = "Descrizione2";
newCategory(productCategory);
donde newCategory es
function newCategory(productCategory)
{
$.postJSON("ajax/newproductcategory", productCategory, function(
idProductCategory)
{
console.debug("Inserted: " + idProductCategory);
});
}
y postJSON es
$.postJSON = function(url, data, callback) {
return jQuery.ajax({
'type': 'POST',
'url': url,
'contentType': 'application/json',
'data': JSON.stringify(data),
'dataType': 'json',
'success': callback
});
};
Con firebug veo que JSON se envía correctamente:
{"idProductCategory":1,"description":"Descrizione2"}
Pero obtengo 415 tipo de medio no compatible. El controlador Spring mvc tiene firma
@RequestMapping(value = "/ajax/newproductcategory", method = RequestMethod.POST)
public @ResponseBody
Integer newProductCategory(HttpServletRequest request,
@RequestBody ProductCategory productCategory)
Hace unos días funcionó, ahora no lo es. Mostraré más código si es necesario. Gracias
var productCategory = { idProductCategory: 1, description: "Descrizione2" };
sería más conciso y más fácil de leer? ¿Necesitas decirle a Spring que acepteapplication/json
específicamente? En otras palabras, ¿se espera que los datos lleguen en forma?Respuestas:
He tenido esto antes con Spring @ResponseBody y fue porque no se envió un encabezado de aceptación con la solicitud. Aceptar encabezado puede ser difícil de configurar con jQuery, pero esto funcionó para mí fuente
@RequestBody utiliza el encabezado Content-Type para determinar qué formato tienen los datos que se envían desde el cliente en la solicitud. @ResponseBody utiliza el encabezado de aceptación para determinar qué formato debe enviar los datos al cliente en la respuesta. Es por eso que necesitas ambos encabezados.
fuente
agregando tipo de contenido en la solicitud como
application/json
resuelto el problemafuente
Tuve un problema similar, pero descubrí que había olvidado proporcionar un constructor predeterminado para el DTO que se anotó con @RequestBody.
fuente
Creo que me encontré exactamente con el mismo problema. Después de innumerables horas de lucha con el JSON, el JavaScript y el servidor, encontré al culpable: en mi caso tenía un objeto Date en el DTO, este objeto Date se convirtió en una cadena para que pudiéramos mostrarlo en la vista con el formato: HH: mm.
Cuando se devolvía la información JSON, este objeto de cadena de fecha tenía que convertirse de nuevo en un objeto de fecha completo, por lo tanto, también necesitamos un método para configurarlo en el DTO. El gran PERO es que no puede tener 2 métodos con el mismo nombre (Sobrecarga) en el DTO incluso si tienen un tipo diferente de parámetro (Cadena vs Fecha) porque esto también le dará el error de tipo 415 Medios no compatibles.
Este fue mi método controlador
Este fue mi ejemplo de DTO (los métodos id get / set y preAlarm get no están incluidos por falta de código):
Para que todo funcione, debe eliminar el método con el parámetro Tipo de fecha. Este error es muy frustrante. Espero que esto pueda ahorrarle a alguien horas de depuración.
fuente
public void setParameters(List<Parameter> parameters)
ypublic void setParameters(Parameter... parameters)
métodos en un grano, cambiando este último aaddParameters
resolver el problema para mí.Me enfrenté a un problema similar y así es como lo solucioné,
El problema se debe al proceso de conversión de JSON a Java, uno necesita tener las bibliotecas jackson de tiempo de ejecución adecuadas para que la conversión se realice correctamente.
Agregue los siguientes frascos (a través de la dependencia o descargando y agregando al classpath).
Esto debería solucionar el problema.
Código completo:
y la firma del controlador se ve así:
Espero que esto ayude
fuente
jackson-databind
se requiere.Me enfrenté a este problema cuando integré el arranque de resorte con mvc de resorte. Lo resolví simplemente agregando estas dependencias.
fuente
Una pequeña nota al margen: tropecé con este mismo error al desarrollar una aplicación web. El error que encontramos al jugar con el servicio con Firefox Poster fue que tanto los campos como los valores en Json deberían estar rodeados de comillas dobles. Por ejemplo..
En nuestro caso, llenamos el json a través de javascript, lo que puede ser un poco confuso cuando se trata de tratar con comillas simples / dobles, por lo que he escuchado.
Lo que se ha dicho antes en esta y otras publicaciones, como incluir los encabezados 'Aceptar' y 'Tipo de contenido', también se aplica.
Espero ayudar.
fuente
Me las arreglé para hacer que funcione. Dime en caso de que me equivoque. Solo utilicé una forma de serializar / deserializar: eliminé todas las anotaciones con respecto a esto (
@JSONSerialize
y@JSONDeserialize
) y registré los serializadores y deserializadores enCustomObjectMapper
clase. No encontré un artículo que explicara este comportamiento, pero lo resolví de esta manera. Espero que sea útil.fuente
Yo tuve el mismo problema. Tuve que seguir estos pasos para resolver el problema:
1. Asegúrese de tener las siguientes dependencias:
2. Cree el siguiente filtro:
3. Aplique el filtro anterior para las solicitudes en web.xml
Espero que esto sea útil para alguien.
fuente
jackson-core
es una dependencia dejackson-databind
, por lo que no es necesario agregarlo directamente.Spring boot + spring mvn
con problema
con solución
fuente
Resolví este problema agregando el enlace de datos jackson-json a mi pom.
fuente
En su clase de modelo, agregue una anotación de propiedad json, también tenga un constructor predeterminado
fuente
Tuve el mismo problema. agregando
al spring-xml lo resolvió
fuente
1.a. Agregue lo siguiente en applicationContext-mvc.xml
xmlns: mvc = "http://www.springframework.org/schema/mvc" xsi: schemaLocation = " http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc
fuente