2010-07-27 13 views
12

He intentado que un controlador en Spring devuelva una respuesta JSON en vano usando las clases Jackson como recommended with 3.0. Tengo los archivos de jackson jar (jackson-core-asl-1.5.5.jar & jackson-mapper-asl-1.5.5.jar) en mi ruta de clases, por supuesto.Spring's Json no se ha resuelto con la respuesta adecuada

En cuanto a las entradas de appconfig.xml, no estoy seguro de que las necesite. Los puse allí como un último acto de desesperación antes de regresar a la vieja moda no jason ajax.

En depuración, observo el controlador recibirá la petición, devuelve el foo y luego, en Firebug, sale un 406.

El error de los mensajes son los siguientes: Desde el registrador cuando se establece en depuración: org .springframework.web.HttpMediaTypeNotAcceptableException: no se pudo encontrar la representación aceptable

partir de la respuesta: (406) el recurso identificado por esta solicitud sólo es capaz de generar respuestas con características no aceptables de acuerdo con la solicitud de "aceptar" cabeceras() .

Mi AppConfig.xml está aquí:

<!-- Configures support for @Controllers --> 
    <mvc:annotation-driven /> 

    <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory --> 
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="mediaTypes"> 
    <map> 
     <entry key="html" value="text/html"/> 
     <entry key="json" value="application/json"/> 
    </map> 
    </property> 
    <property name="viewResolvers"> 
    <list> 
     <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/> 
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
     </bean> 
    </list> 
    </property> 
    <property name="defaultViews"> 
    <list> 
     <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 
    </list> 
    </property> 
</bean> 
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basename" value="messages"></property> 
    </bean> 

Mi controlador

@RequestMapping(value="foo/bar", method=RequestMethod.GET) 
public @ResponseBody foo getFoo(@RequestParam String fooId) { 
    return new foo(fooId); 
} 

En el JSP, donde se hace la llamada AJAX:

function addRow() { 
$.getJSON("foo/bar",{ fooId: 1} , function(data) { 
alert("it worked.");   
}); 

}

Avísame si hay un ny más información que se necesita.

+0

más cobertura en [Spring JSON request getting 406 (no acceptable)] (http://stackoverflow.com/questions/7462202/spring-json-request-getting-406-not-acceptable) – kdgregory

Respuesta

14

Deshágase de todos los beans de Jackson, y del mapeo json en la resolución de negociación. el mvc:annotation-driven debe configurar todo lo que necesita para que funcione la serialización Jackson.

+0

¡Gracias! Quité todo lo relacionado con Jackson y apareció la alerta. – ClutchDude

+0

Intenté esto también, pero no funcionó para mí. ¿Algunas ideas? Tengo a Jackson en mi ruta de clase, y estoy usando un objeto simple, pero aún así no parece cortarlo. – stevebot

+0

@stevebot puede hacer una nueva pregunta, proporcionando detalles relevantes. – Bozho

1

Enviando el aceptar: el encabezado application/xml no funciona. Pero enviando Accept: application/json realmente funciona, y el mapper de jackson entra en acción. Me deshice de mi 406 y obtuve mi objeto Java serializado en formato json sin más configuración que @ResponseBody y devuelvo el nuevo MyObject() :) Gracias skaffman para esta información, y gracias Bozho por el valor del encabezado de trabajo: D

+1

¿Qué hay de usar 'produces =" application/json "' en la anotación @RequestBody. – Ithar

1

Esta pregunta aparece en todas partes en la red y me picaron un par de veces. Spring 3.0.6 (y 5 posiblemente) tiene algunos problemas en la representación de json. Una vez que cambié a la versión 3.1.0.RELEASE, todo funcionó TAL CUAL. Sin ningún cambio de configuración. Lo que debe tener en cuenta es que el método de retorno debe tener @ResponseBody (como en el ejemplo anterior) y debe estar en servlet-context.xml o su archivo de configuración de contexto de primavera.

0

Puede que mi respuesta sea un poco tarde, pero puede ayudar a alguien más a visitar esta pregunta.

Tengo mi problema resuelto mediante la adición de

hibernate-validator-4.0.2 

y me dio otra excepción (clase no encontré excepción: org.slf4j.LoggerFactory), que he resuelto mediante la adición de

slf4j-api-1.5.6.jar 

espero que ayudará a alguien

2

Además, asegúrese de agregar dos archivos jar relacionados con jackson.

  • jackson-core-asl-1.9.8.jar
  • jackson-mapper-asl-1.9.8.jar

La versión puede ser diferente.

+0

Sí, esto era lo que me estaba perdiendo. Para usar '@ RequestBody' y' @ ResponseBody', el formato predeterminado será json y los jar de jackson se considerarán para la conversión de su pojo. –

2

Sé que este es un hilo antiguo, pero tal vez alguien encuentre el mismo problema que yo. Obtuve esa excepción al migrar una aplicación de Spring 4.0.3.RELEASE a Spring 4.1.0.RELEASE. En mi caso, la actualización de Jackson de 1.9.x a 2.4.x hizo el truco.

3
  1. Asegúrate de que el POJO que regresas tenga() ers, uno para cada campo.
  2. Asegúrese de que el servidor de aplicaciones (Tomcat) tenga las bibliotecas, incluso si está seguro de que su sistema de compilación (Eclipse/Maven) sí lo tiene.

He tenido este error dos veces. Justo ahora agregué getters a mi pojo. El error 406 desapareció y obtuve JSON como se esperaba. Supongo que porque mis campos estaban protegidos por paquetes (el acceso predeterminado), los atraparía, pero supongo que no. Para el registro, en caso de que importe, también hice que POJO implementara Serializable, toString(), serialVersionUID, constructor no-arg y constructores explícitos.

La vez anterior limpié/limpiaba/actualizaba mi caché de Tomcat e hice lo que fuera para forzarlo a volver a cargar. Creo que cuando agregué las dependencias de Jackson, arreglé mis errores de compilación, pero como Tomcat no los vio, en tiempo de ejecución Spring MVC no descubrió las bibliotecas de Jackson y produjo el error 406 sobre el tipo de respuesta inaceptable.

1

Tengo la misma excepción al migrar de la primavera 3.xa la primavera 4.x.

Lo resuelto con la actualización de dependencias Jackson de

<dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.13</version> 
    </dependency> 

que se necesitaba

<dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.5.1</version> 
    </dependency> 

Nada más para mí.

+0

Funcionó para mí también. – renanlf

Cuestiones relacionadas