Tipo de medio sin respaldo Spring MVC 415

Estoy usando Spring 3.2 y trato de utilizar una solicitud de publicación de ajax para enviar una matriz de objetos json. Si esto es relevante, escapé de todos los caracteres especiales.

Obtengo un estado HTTP de 415.

Mi controlador es:

@RequestMapping(value = "/save-profile", method = RequestMethod.POST,consumes="application/json") public @ResponseBody String saveProfileJson(@RequestBody String[] profileCheckedValues){ System.out.println(profileCheckedValues.length); return "success"; } 

jquery es:

 jQuery("#save").click(function () { var profileCheckedValues = []; jQuery.each(jQuery(".jsonCheck:checked"), function () { profileCheckedValues.push($(this).val()); }); if (profileCheckedValues.length != 0) { jQuery("body").addClass("loading"); jQuery.ajax({ type: "POST", contentType: "application/json", url: contextPath + "/sample/save-profile", data: "profileCheckedValues="+escape(profileCheckedValues), dataType: 'json', timeout: 600000, success: function (data) { jQuery('body').removeClass("loading"); }, error: function (e) { console.log("ERROR: ", e); jQuery('body').removeClass("loading"); } }); } }); 

y un ejemplo de uno de los objetos de la matriz que estoy publicando es el siguiente json:

 { "id": "534213341", "name": "Jack Lindamood", "first_name": "Jack", "last_name": "Lindamood", "link": "https://www.facebook.com/jack", "username": "jack", "gender": "male", "locale": "en_US", "updated_time": "2013-07-23T21:13:23+0000" } 

El error es:

 The server refused this request because the request entity is in a format not supported by the requested resource for the requested method 

¿Por qué está ocurriendo este error? ¿Alguien lo sabe?

Puede probar con HttpServletRequest . no tiene ningún problema

  @RequestMapping(value = "/save-profile", method = RequestMethod.POST,consumes="application/json",headers = "content-type=application/x-www-form-urlencoded") public @ResponseBody String saveProfileJson(HttpServletRequest request){ System.out.println(request.getParameter("profileCheckedValues")); return "success"; } 

1) Agregue las siguientes dependencias

  com.fasterxml.jackson.core jackson-core ${jackson-version} // 2.4.3   com.fasterxml.jackson.core jackson-databind ${jackson-version} // 2.4.3  

2) Si está utilizando la anotación @RequestBody en el método del controlador, asegúrese de haber agregado lo siguiente en el archivo xml

  

Esto debería resolver el problema del código de estado 415.

Deberá agregar jackson y jackson-databind a classpath. Spring lo recogerá usando MappingJacksonHttpMessageConverter

MappingJacksonHttpMessageConverter

Una implementación HttpMessageConverter que puede leer y escribir JSON utilizando el ObjectMapper de Jackson. El mapeo JSON se puede personalizar según sea necesario mediante el uso de las anotaciones provistas por Jackson. Cuando se necesita más control, se puede inyectar un ObjectMapper personalizado a través de la propiedad ObjectMapper para los casos en que se deben proporcionar serializadores / deserializadores JSON personalizados para tipos específicos. Por defecto, este convertidor es compatible (aplicación / json).

Tenía consume="application/json" en mi configuración de asignación de solicitudes que espera una entrada json. Cuando envié una solicitud que no es una entrada JSON, Spring se quejó del tipo de medio 415 Unsupported. Así que eliminar el consume="application/json" funcionó para mí. Así que mire la entrada de solicitud y el tipo de medio aceptado en la firma de su método de controlador Spring. Una falta de coincidencia arrojaría el error 415. Esta será probablemente la razón del problema.

intente cambiar json por application/json para tipo de datos. ¿Y a qué se parece tu json si es válido ? Nunca he visto a json convertido a String [] antes, así que este podría ser el problema.

Yo tuve el mismo problema. Tenía que seguir estos pasos para resolver el problema:

1. Asegúrese de tener las siguientes dependencias:

   com.fasterxml.jackson.core jackson-core ${jackson-version} // 2.4.3   com.fasterxml.jackson.core jackson-databind ${jackson-version} // 2.4.3  

2. Crea el siguiente filtro:

  public class CORSFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String origin = request.getHeader("origin"); origin = (origin == null || origin.equals("")) ? "null" : origin; response.addHeader("Access-Control-Allow-Origin", origin); response.addHeader("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, DELETE, OPTIONS"); response.addHeader("Access-Control-Allow-Credentials", "true"); response.addHeader("Access-Control-Allow-Headers", "Authorization, origin, content-type, accept, x-requested-with"); filterChain.doFilter(request, response); } } 

3. Aplique el filtro anterior para las solicitudes en web.xml

   corsFilter com.your.package.CORSFilter   corsFilter /*  

Espero que esto sea útil para alguien.

Tuve el mismo problema, acabo de mostrar la siguiente línea de código en spring-servlet.xml, estaba casi al final de este archivo xml. Funcionó.