mvc example java jquery spring spring-mvc jackson

java - example - mvc de primavera no devuelve el contenido json-error 406



spring mvc ajax crud example (13)

Agregue org.springframework.http.converter.json.MappingJacksonHttpMessageConverter y org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter a DispatcherServlet-servlet.xml. y se refieren a la primera en el segundo usando

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

Estoy usando Spring MVC con JSON como se especifica en el artículo Ajax Simplification Spring 3.0 .

Después de tantos intentos y variaciones de mi código según los consejos encontrados en varios foros, mi código aún no funciona.

Sigo recibiendo el siguiente error: (406) El recurso identificado por esta solicitud solo es capaz de generar respuestas con características no aceptables de acuerdo con los encabezados de solicitud "aceptar" ().

Tengo en mi appconfig.xml según sea necesario.

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>

Esto es lo que tengo para mi controlador

@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; } }

jsp jquery llamada

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

Realmente agradecería cualquier aporte sobre este tema. Gracias


Como dice axtavt, mvc: annotation-driven y jackson JSON mapper son todo lo que necesitas. Seguí eso y obtuve que mi aplicación devolviera cadenas JSON y XML desde el mismo método sin cambiar ningún código, siempre que haya @XmlRootElement y @XmlElement en el objeto que está devolviendo desde el controlador. La diferencia estaba en el parámetro de aceptación pasado en la solicitud o el encabezado. Para devolver xml, cualquier invocación normal desde el navegador lo hará, de lo contrario pasará el accept como ''application / xml''. Si desea que se devuelva JSON, use ''application / json'' en el parámetro accept en la solicitud.

Si usa Firefox, puede usar tamperdata y cambiar este parámetro


En lugar de @RequestMapping(...headers="Accept=application/json"...) use @RequestMapping(... , produces = "application/json")


He usado la configuración de Java y obtuve el mismo error. Me he equivocado al agregar @EnableWebMvc al archivo de configuración. Este error se resuelve luego de agregar el @EnableWebMvc en mi archivo webconfig.

Además, el Objeto que se devuelve desde su Controlador de Primavera, debe tener los métodos getter y setter apropiados.

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; } }

También asegúrese de que el Objeto que se devuelve tenga el getter y el setter apropiados.

Ejemplo:

@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; }

El objeto TaskInfo debe tener getter y setter apropiados. si no, se arrojará el error 406.

Archivo POM para referencia:

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


Intente eliminar la limitación del encabezado para Accept , ponga un punto de interrupción y vea cuál es el valor real. O haz esto con FireBug.

También eche un vistazo a este problema jquery


Para devolver la respuesta JSON de @ResponseBody un método anotado, necesita dos cosas:

No necesita ContentNegotiatingViewResolver y headers en @RequestMapping .



También tuve este problema, tienes que agregar <mvc:annotation-driven /> en tu configuración xml

y

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

en tu pom.xml


Tuve este problema después de actualizar Spring a 4.1.x desde 3.2.x. Lo arreglé actualizando Jackson de 1.9.x a 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>


Usando jQuery, puede establecer contentType a la deseada (application / json; charset = UTF-8 ''aquí) y establecer el mismo encabezado en el lado del servidor.

RECUERDE BORRAR CACHE MIENTRAS PROBEA.


Vea mi respuesta a un problema similar aquí con Spring MVC interpretando la extensión del URI y cambiando el tipo de MIME esperado producido detrás de la escena, por lo tanto produciendo un 406.


Yo también recibí este error y mientras depuraba profundamente en el agujero del conejo encontré esta excepción

java.lang.IllegalArgumentException: definiciones de getter contradictorias para la propiedad "error": com.mycomp.model.OutputJsonModel # isError (0 params) vs com.mycomp.model.OutputJsonModel # getError (0 params)

Así que básicamente en mi Java Bean tuve algo como lo siguiente:

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; }

Cambiar el nombre de la variable de miembro de error por otra cosa resolvió los problemas.


el problema no está relacionado con jquery. incluso el error está diciendo que es un problema del lado del servidor. por favor, asegúrese de que después de 2 jar presente en la ruta de clase: -

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