2011-09-07 9 views
14

Tengo un problema al intentar configurar @ResponseBody para devolver una colección. Tengo JAXB jar en classpath y no configuré ningún ContentNegotiatingViewResolver.Spring MVC @ResponseBody que devuelve un mapa produce "Error 406 NO ACEPTABLE"

Ésta es mi objeto simple: -

@XmlRootElement(name = "test-object") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class TestObject implements Serializable { 

    @XmlAttribute 
    private int id; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 
} 

me escribió una prueba simple que devuelve un único objeto ... esto funciona sin problema, y ​​yo soy capaz de ver el XML generado: -

@RequestMapping(value = "one", method = RequestMethod.GET) 
public @ResponseBody TestObject getSingleObject() { 
    TestObject obj = new TestObject(); 
    obj.setId(1); 

    return obj; 
} 

Lo que realmente quiero es devolver una lista de objetos. Después de leer todo, parece que la manera de hacerlo es colocar la lista en un mapa y devolver el Mapa: -

@RequestMapping(value = "all", method = RequestMethod.GET) 
public @ResponseBody Map<String, ? extends Object> getAllObjects() { 
    TestObject obj1 = new TestObject(); 
    obj1.setId(1); 

    TestObject obj2 = new TestObject(); 
    obj2.setId(2); 

    List<TestObject> list = Arrays.asList(obj1, obj2); 

    return Collections.singletonMap("all-objects", list); 
} 

Cuando ejecuto lo anterior, estoy recibiendo "Error 406 No Aceptable".

¿Qué hice mal aquí? Me estoy ejecutando en Jetty 6.1 si eso hace la diferencia.

Gracias.

+1

¿funcionó alguna de las soluciones aquí? – Ram

Respuesta

0

Más una sugerencia que una respuesta, pero ¿ha tratado de crear el mapa y luego agregar el objeto y luego simplemente devolver el mapa de esta manera?

@RequestMapping(value = "all", method = RequestMethod.GET) 
public @ResponseBody Map<String, ? extends Object> getAllObjects() { 
    TestObject obj1 = new TestObject(); 
    obj1.setId(1); 

    TestObject obj2 = new TestObject(); 
    obj2.setId(2); 

    List<TestObject> list = Arrays.asList(obj1, obj2); 
    Map<String, Object> map = new TreeMap<String, Object>(); 
    map.put("all-objects",list); 
    return map; 
} 
+0

No funcionó para mí. – limc

10

¡Usted necesita estas dos dependencias agregadas en el pom.xml!

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-core-lgpl</artifactId> 
    <version>1.8.1</version> 
</dependency> 

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-mapper-lgpl</artifactId> 
    <version>1.8.1</version> 
</dependency> 
5

Tuve el mismo problema y después de un par de horas de depuración finalmente encontré la solución. Solo en caso de que alguien más se quede atascado con el mismo problema, esto es lo que encontré.

Probablemente siguió Ajax Simplifications in Spring 3 que le indica que use el elemento de configuración mvc: anotación-driven.

Lo que no dice es que mvc: annotation-driven es solo un atajo para definir un par de beans estándar, ¡a menos que ya tenga uno de esos beans definidos!

Con la MVC: anotación impulsada configuración un MappingJacksonHttpMessageConverter está registrada como un messageConverter en un org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.

Si ha definido su propio AnnotationMethodHandlerAdapter, también debe definir manualmente este MappingJacksonHttpMessageConverter.

Cfr. Custom message converters registered with AnnotationMethodHandlerAdapter are not used, only the default ones are used. que trata un problema similar. también comprobar SPR-6524 y SPR-6306, no pueden publicar enlaces debido a la prevención de spam :(

La parte relevante en mi config primavera terminó pareciéndose a esto:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
     <property name="webBindingInitializer"> 
      <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
       <property name="validator"> 
        <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
        </bean> 
       </property> 
      </bean> 
     </property> 
     <property name="messageConverters"> 
      <list> 
       <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.feed.RssChannelHttpMessageConverter"/> 
      </list> 
     </property> 
</bean> 
2

Sé que esta pregunta es un poco viejo, pero tenía el mismo problema

he resuelto añadiendo construir ruta dos tarros:.. jackson-core-asl-1.x.jar y jackson-mapper-asl-1.x.jar puede descargar desde aquí: http://wiki.fasterxml.com/JacksonDownload o si utiliza Maven puede agregarlos como la dependencia Projet.

Tenga en cuenta que he usado la versión 1.x (1.9, en mi caso) y no 2.x. La última versión no funcionó para mí.

Cuestiones relacionadas