2010-11-01 14 views
26

Sto utilizzando Spring MVC con JSON come specificato in Ajax Simplification Spring 3.0 article.mvc molla non restituisce contenuto json - errore 406

Dopo tanti tentativi e varianti del mio codice in base ai consigli trovati su vari forum, il mio codice continua a non funzionare.

Continuo a ottenere il seguente errore: (406) La risorsa identificata da questa richiesta è solo in grado di generare risposte con caratteristiche non accettabili in base alla richiesta "accetta" intestazioni().

Ho nel mio file appconfig.xml come richiesto.

app-config.xml

<context:component-scan base-package="org.ajaxjavadojo" /> 

    <!-- Configures Spring MVC --> 
    <import resource="mvc-config.xml" /> 

MVC-config.xml

<mvc:annotation-driven /> 

<!-- Forwards requests to the "/" resource to the "index" view --> 
<mvc:view-controller path="/" view-name="index"/> 


<!-- 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> 

</bean> 

Questo è quello che ho per il mio controller

@Controller 
@RequestMapping (value = "/convert") 
public class ConversionController { 

    @RequestMapping(method=RequestMethod.GET) 
    public String getConversionForm(){ 
    return "convertView"; 
    } 

    @RequestMapping(value = "/working", headers="Accept=application/json", method=RequestMethod.GET) 
    public @ResponseBody Conversion getConversion(){ 
    Conversion d = new Conversion("d"); 
    return d; 
    } 
} 

chiamata jsp jquery

function convertToDecimal(){ 
    $.getJSON("convert/working", {key: "r"}, function(aConversion){ 
     alert("it worked."); 
     $('#decimal').val(aConversion.input); 
    }); 
    } 

Apprezzerei molto qualsiasi input su questo problema. Grazie

risposta

8

Provare a rimuovere la limitazione dell'intestazione per Accept, inserire un punto di interruzione e vedere qual è il valore effettivo. O fallo con FireBug.

prendere anche uno sguardo al this jquery issue

+3

Grazie mille. Secondo l'articolo, l'intestazione di accettazione dovrebbe essere impostata su */*. così ho aggiornato il mapping della richiesta a: @RequestMapping (value = "/ working", headers = "Accept = */*", method = RequestMethod.GET) e ora funziona :)) – serena

23

Per tornare risposta JSON da @ResponseBody metodo -annotated, avete bisogno di due cose:

È don 'necessario ContentNegotiatingViewResolver e headers in @RequestMapping.

+0

Ho rimosso le informazioni ContentNegotiatingViewResolver e le intestazioni, ma non è ancora funzionante. Quando dici sul classpath, significa che devo importare le librerie di Jackson? Se è così, li ho inclusi. – serena

+0

Quindi nella domanda c'è qualcosa di poco chiaro: in che modo 'app-config.xml' è correlato alla configurazione' ...- servlet.xml' di DispatcherServlet? – axtavt

+0

in web.xml, si specifica il servlet, quindi app-config.xml (contextConfigLocation): dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/app-config.xml 1 serena

0

Come detto da axtavt, MVC: annotazioni-driven e Jackson JSON mapper sono tutto ciò che vi serve. L'ho seguito e ho ottenuto la mia applicazione per restituire entrambe le stringhe JSON e XML dallo stesso metodo senza modificare alcun codice, a condizione che ci siano @XmlRootElement e @XmlElement nell'oggetto che si sta restituendo dal controller. La differenza era nel parametro accept passato nella richiesta o nell'intestazione. Per restituire xml, qualsiasi invocazione normale dal browser lo farà, altrimenti passare l'accettazione come 'application/xml'. Se vuoi che venga restituito JSON, usa 'application/json' nel parametro accept nella richiesta.

Se si utilizza Firefox, è possibile utilizzare TamperData e modificare questo parametro

3

troppo ho ottenuto questo errore e durante il debug in profondità nella tana del coniglio mi sono imbattuto in questa eccezione

java.lang.IllegalArgumentException: Conflicting getter definitions for property "error": com.mycomp.model.OutputJsonModel#isError(0 params) vs com.mycomp.model.OutputJsonModel#getError(0 params)

Quindi, in pratica in il mio fagiolo java ho avuto qualcosa di simile al seguente:

private boolean isError; 
private ErrorModel error; 

public ErrorModel getError() { 
return error; 
} 

public void setError(ErrorModel error) { 
this.error = error; 
} 
public boolean isError() { 
return isError; 
} 

public void setError(boolean isError) { 
this.isError = isError; 
} 

Cambiare uno del nome variabile membro errore a qualcos'altro risolto i problemi.

+0

Grazie amico, la tua risposta mi ha fatto capire che ho dimenticato i metodi getter e setter. – Dinei

+0

Ho avuto lo stesso problema. Assicurati che l'oggetto risposta abbia getter e setter. – user1885834

1

il problema non è correlato a jquery. anche bug sta dicendo che è un problema lato server. Assicurarsi che dopo 2 barattolo presente nel percorso di classe: -

jackson-core-ASL-1.9.X.jar jackson-mapper-ASL-1.9.X.jar

+0

Una versione di questo ha risolto per me quando sono passato da 1.9.x jackson a 2.x (fasterxml). Avevo solo core importato ma non annotazioni o l'associazione dei dati. Non ero contento di rimuovere l'opzione di accettazione. – Chanoch

8

Aggiungi org.springframework.http.converter.json.MappingJacksonHttpMessageConverter e org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter a DispatcherServlet -servlet.xml. e si riferiscono alla primo nel secondo utilizzando

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jacksonMessageConverter"/> 
     </list> 
    </property> 
</bean> 
+0

Grazie mille, questo ha funzionato per me! L'unico cambiamento è rinominare MappingJacksonHttpMessageConverter in MappingJackson2HttpMessageConverter nello snippet che è l'ultima versione della primavera - 4.2.0.RELEASE – vanval

0

Invece di @RequestMapping(...headers="Accept=application/json"...) uso @RequestMapping(... , produces = "application/json")

0

Utilizzando jQuery, è possibile impostare contentType a quella desiderata (application/json; charset = UTF-8' qui) e imposta la stessa intestazione sul lato server.

RICORDARE PER CANCELLARE CACHE MENTRE LE PROVE.

2

ho avuto anche questo problema, è necessario aggiungere <mvc:annotation-driven /> nella configurazione XML

e

<!-- Jackson --> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>${jackson.databind-version}</version> 
     </dependency> 

nella vostra pom.xml

18

Ho avuto questo problema dopo aver aggiornato Spring a 4.1.x da 3.2.x. Ho risolto aggiornando Jackson da 1.9.x alla 2.2.x (fasterxml)

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.2.3</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.2.3</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-annotations</artifactId> 
    <version>2.2.3</version> 
</dependency> 
+0

Thx amico, il problema mi stava facendo impazzire! –

+0

questa è la risposta al mio problema. grazie uomo. –

1

Vedi my answer to a similar problem here con Spring MVC interpretare l'estensione della URI e cambiando il tipo MIME previsto prodotta dietro la scena, producendo quindi un 406.

2

Ho usato la configurazione java e ho ottenuto lo stesso errore. Mi sono perso per aggiungere @EnableWebMvc al file di configurazione. Questo errore viene risolto dopo aver aggiunto @EnableWebMvc nel mio file webconfig.

Anche l'oggetto restituito dal controller Spring, deve disporre dei metodi getter e setter appropriati.

package com.raghu.dashboard.config; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 

import com.raghu.dashboard.dao.ITaskDAO; 
import com.raghu.dashboard.dao.TaskDAOImpl; 


    @Configuration 
    @EnableWebMvc //missed earlier...after adding this it works.no 406 error 
    @ComponentScan(basePackages = { "com.raghu.dashboard.api", "com.raghu.dashboard.dao" }) 
    public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer { 

     protected Class<?>[] getRootConfigClasses() { return null;} 

     protected Class<?>[] getServletConfigClasses() { 
      return new Class[] { MongoConfiguration.class}; 
     } 

     protected String[] getServletMappings() { 
      return new String[]{"*.htm"}; 
     } 

     @Bean(name = "taskDao") 
     public ITaskDAO taskDao() { 
      return new TaskDAOImpl(); 
     } 

     @Bean 
     public InternalResourceViewResolver getInternalResourceViewResolver() { 
      InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
      resolver.setPrefix("/WEB-INF/pages/"); 
      resolver.setSuffix(".jsp"); 
      return resolver; 
     } 

    } 

AppInitializer.java

package com.raghu.dashboard.config; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRegistration; 

import org.springframework.web.WebApplicationInitializer; 
import org.springframework.web.context.ContextLoaderListener; 
import org.springframework.web.context.WebApplicationContext; 
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; 
import org.springframework.web.servlet.DispatcherServlet; 
    public class AppInitalizer implements WebApplicationInitializer { 

     @Override 
     public void onStartup(ServletContext servletContext) 
       throws ServletException { 
      WebApplicationContext context = getContext(); 
      servletContext.addListener(new ContextLoaderListener(context)); 
      ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context)); 
      dispatcher.setLoadOnStartup(1); 
      dispatcher.addMapping("/*"); 
     } 

     private AnnotationConfigWebApplicationContext getContext() { 
      AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
      context.register(com.raghu.dashboard.config.WebConfig.class); 
      context.scan("com.raghu.dashboard.api"); 
      return context; 
     } 

    } 

anche assicurarsi l'oggetto che viene restituito, ha la corretta getter e setter.

Esempio:

@RequestMapping(value = "/list", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
@ResponseBody 
public ResponseEntity<TaskInfo> findAll() { 
    logger.info("Calling the findAll1()"); 
    TaskInfo taskInfo = dashboardService.getTasks(); 
    HttpHeaders headers = new HttpHeaders(); 
    headers.add("Access-Control-Allow-Origin", "*"); 
    ResponseEntity<TaskInfo> entity = new ResponseEntity<TaskInfo>(taskInfo, 
      headers, HttpStatus.OK); 
    logger.info("entity is := " + entity); 
    return entity; 
} 

TaskInfo oggetto dovrebbe avere una corretta getter e setter. in caso contrario, verrà generato un errore 406.

POM file per Riferimento:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.raghu.DashBoardService</groupId> 
    <artifactId>DashBoardService</artifactId> 
    <packaging>war</packaging> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>DashBoardService Maven Webapp</name> 
    <url>http://maven.apache.org</url> 
    <properties> 
     <!-- Spring --> 
     <spring-framework.version>4.0.6.RELEASE</spring-framework.version> 
     <jackson.version>2.4.0</jackson.version> 
     <jaxb-api.version>2.2.11</jaxb-api.version> 
     <log4j.version>1.2.17</log4j.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.mongodb</groupId> 
      <artifactId>mongo-java-driver</artifactId> 
      <version>2.10.1</version> 
     </dependency> 
     <!-- Spring Data Mongo Support --> 
     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-mongodb</artifactId> 
      <version>1.4.1.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-beans</artifactId> 
      <version>${spring-framework.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${spring-framework.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${spring-framework.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>${spring-framework.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${spring-framework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>cglib</groupId> 
      <artifactId>cglib</artifactId> 
      <version>3.1</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-expression</artifactId> 
      <version>${spring-framework.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aop</artifactId> 
      <version>${spring-framework.version}</version> 
     </dependency> 

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-tx</artifactId> 
    <version>${spring-framework.version}</version> 
</dependency> 


<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-dao</artifactId> 
    <version>2.0.3</version> 
</dependency> 



     <!-- Jackson mapper --> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>2.2.3</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>2.2.3</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-annotations</artifactId> 
      <version>2.2.3</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.0.1</version> 
     </dependency> 

     <dependency> 
      <groupId>com.google.code.gson</groupId> 
      <artifactId>gson</artifactId> 
      <version>1.7.1</version> 
     </dependency> 

     <!-- Log4j --> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>${log4j.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-commons</artifactId> 
      <version>1.5.0.RELEASE</version> 
     </dependency> 

    </dependencies> 

    <build> 
     <finalName>DashBoardService</finalName> 
     <resources> 
      <resource> 
       <directory>src/main/resources</directory> 
       <filtering>true</filtering> 
      </resource> 
     </resources> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.5.1</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.6</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

</project> 
+0

Anche per me questo ha risolto il problema, ma non ho idea del perché? Alcuna spiegazione? – Shady

Problemi correlati