简体   繁体   English

spring mvc没有返回json内容 - 错误406

[英]spring mvc not returning json content - error 406

I am using Spring MVC with JSON as specified in Ajax Simplification Spring 3.0 article . 我正在使用带有JSON的Spring MVC,如Ajax Simplification Spring 3.0文章中所指定的那样。

After so many attempts and variations of my code depending on advice found on various forums, my code still doesn't work. 根据各种论坛上的建议,在我的代码进行了如此多的尝试和变化之后,我的代码仍然不起作用。

I keep on getting the following error: (406) The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers (). 我继续收到以下错误:(406)此请求标识的资源只能根据请求“accept”headers()生成具有不可接受特征的响应。

I have in my appconfig.xml as required. 我根据需要在appconfig.xml中。

app-config.xml APP-config.xml中

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

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

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>

This is what I have for my 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;
  }
}

jsp jquery call jsp jquery调用

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

I would really appreciate any input on this issue. 我真的很感激在这个问题上的任何意见。 Thank you 谢谢

To return JSON response from @ResponseBody -annotated method, you need two things: 要从@ResponseBody -annotated方法返回JSON响应,您需要两件事:

You don't need ContentNegotiatingViewResolver and headers in @RequestMapping . 您不需要@RequestMapping ContentNegotiatingViewResolverheaders

I had this problem after I upgraded Spring to 4.1.x from 3.2.x. 我将Spring从4.1.x升级到4.1.x后出现了这个问题。 I fixed by upgrading Jackson from 1.9.x to 2.2.x (fasterxml) 我通过将Jackson从1.9.x升级到2.2.x(更快的xml)来修复

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

Add org.springframework.http.converter.json.MappingJacksonHttpMessageConverter and org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter to DispatcherServlet-servlet.xml. org.springframework.http.converter.json.MappingJacksonHttpMessageConverterorg.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter添加到DispatcherServlet-servlet.xml。 and refer to the the first one in the second using 并参考第二个使用的第一个

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

Try remove the header limitation for Accept , put a breakpoint and see what's the actual value. 尝试删除Accept的标题限制,设置断点并查看实际值是什么。 Or do this with FireBug. 或者使用FireBug执行此操作。

Also take a look at this jquery issue 另请看一下这个jquery问题

I too got this error and while debugging deep down into the rabbit hole i came across this exception 我也遇到了这个错误,当我深入调试兔子洞时,我遇到了这个异常

java.lang.IllegalArgumentException: Conflicting getter definitions for property "error": com.mycomp.model.OutputJsonModel#isError(0 params) vs com.mycomp.model.OutputJsonModel#getError(0 params) java.lang.IllegalArgumentException:属性“error”的冲突getter定义:com.mycomp.model.OutputJsonModel#isError(0 params)vs com.mycomp.model.OutputJsonModel #getError(0 params)

So basically in my java bean i had something like the following: 所以基本上在我的java bean中我有类似以下内容:

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

Changing one of the error member variable name to something else solved the issues. 将错误成员变量名称之一更改为其他内容可解决问题。

I had this problem too, you have to add <mvc:annotation-driven /> in your configuration xml 我也有这个问题,你必须在你的配置xml中添加<mvc:annotation-driven />

and

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

in your pom.xml 在你的pom.xml中

I have used java configuration and i got this same error. 我使用了java配置,我也遇到了同样的错误。 I have missed to add the @EnableWebMvc to the configuration file. 我错过了将@EnableWebMvc添加到配置文件中。 This error is resolved after i add the @EnableWebMvc in my webconfig file. 在我的webconfig文件中添加@EnableWebMvc后,此错误得以解决。

Also the Object that is returned from your Spring Controller, should have proper getter and setter methods. 从Spring Controller返回的Object也应该有适当的getter和setter方法。

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

    }

Also make sure the Object that is returned, has the proper getter and setter. 还要确保返回的Object具有正确的getter和setter。

Example: 例:

@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 object should have proper getter and setter. TaskInfo对象应该有适当的getter和setter。 if not, 406 error will be thrown. 如果没有,将抛出406错误。

POM File for Reference: POM文件供参考:

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

issue is not related to jquery . 问题与jquery无关。 even bug is saying it is server side issue . 甚至bug都说它是服务器端问题。 please make sure that following 2 jar present in class path :- 请确保在课程路径中出现以下2个jar: -

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

I also faced this same issue and I downloaded this [jar]: ( http://www.java2s.com/Code/Jar/j/Downloadjacksonall190jar.htm )! 我也遇到了同样的问题,我下载了这个[jar] :( http://www.java2s.com/Code/Jar/j/Downloadjacksonall190jar.htm )! and placed in lib folder and the app works like a charm :) 并放在lib文件夹中,该应用程序就像一个魅力:)

在这里看到我对类似问题的回答 ,Spring MVC解释了URI的扩展并改变了场景后面产生的预期MIME类型,因此产生了406。

Well, The answers on this page might be right but they didn't expatiate well. 那么,这个页面上的答案可能是正确的,但他们没有详细阐述。 This is what I did 这就是我做的

I added this to my pom.xml 我把它添加到我的pom.xml中

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

Then I added headers to my RequestMapping like below 然后我在下面的RequestMapping中添加了标题

@RequestMapping(value="/admin/getGallery", method = RequestMethod.GET, headers={"Content-Type=application/json"})

Then in my jquery ajax I added - contentType: "application/json", so it looks like 然后在我的jquery ajax中我添加了 - contentType:“application / json”,所以它看起来像

jQuery.ajax({
            type:'GET',
            url:"getGallery.html",
            data: "designId="+designId,
            processData:false,
            contentType: "application/json",
            //dataType: "json",
           success:function(data){
              console.log(data);

           },
            error : function(e) {
                console.log("ERROR: ", e);
            },
        });

Then in my servlet I added 然后在我的servlet中我添加了

<bean id="jsonHttpMessageConverter"
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
    <!-- Bind the return value of the Rest service to the ResponseBody. -->
    <bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
    <util:list id="beanList">
    <ref bean="jsonHttpMessageConverter" />
    </util:list>
    </property>
</bean> 

If you have problem with util tag in your servlet just just add in the same servlet file 如果servlet中的util标签有问题,只需添加相同的servlet文件即可

xmlns:util="http://www.springframework.org/schema/util"

and

xsi:schemaLocation="http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd

而不是@RequestMapping(...headers="Accept=application/json"...)使用@RequestMapping(... , produces = "application/json")

Using jQuery , you can set contentType to desired one (application/json; charset=UTF-8' here) and set same header at server side. 使用jQuery,您可以将contentType设置为所需的内容(application / json; charset = UTF-8'),并在服务器端设置相同的标头。

REMEMBER TO CLEAR CACHE WHILE TESTING. 记得在测试时清除高速缓存。

As said by axtavt, mvc:annotation-driven and jackson JSON mapper are all that you need. 正如axtavt所说,mvc:annotation-driven和jackson JSON mapper就是你所需要的。 I followed that and got my application to return both JSON and XML strings from the same method without changing any code, provided that there are @XmlRootElement and @XmlElement in the object you are returning from the controller. 我遵循了这一点,让我的应用程序在不更改任何代码的情况下从同一方法返回JSON和XML字符串,只要在从控制器返回的对象中有@XmlRootElement和@XmlElement。 The difference was in the accept parameter passed in the request or header. 区别在于请求或标头中传递的accept参数。 To return xml, any normal invocation from the browser will do it, otherwise pass the accept as 'application/xml'. 要返回xml,浏览器的任何正常调用都会执行,否则将accept作为'application / xml'传递。 If you want JSON returned, use 'application/json' in the accept parameter in request. 如果要返回JSON,请在请求中的accept参数中使用'application / json'。

If you use firefox, you can use tamperdata and change this parameter 如果使用firefox,则可以使用tamperdata并更改此参数

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM