spring mvc не возвращает содержимое json — ошибка 406

Я использую Spring MVC с JSON, как указано в Статья Ajax Simplification Spring 3.0.

После стольких попыток и вариантов моего кода в зависимости от советов, найденных на различных форумах, мой код все еще не работает.

Я продолжаю получать следующую ошибку: (406) Ресурс, указанный в этом запросе, способен генерировать только ответы с характеристиками, неприемлемыми в соответствии с заголовками «принять» запроса ().

У меня есть в моем appconfig.xml по мере необходимости.

приложение-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>

Это то, что у меня есть для моего контроллера

@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

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

Я был бы очень признателен за любой вклад по этому вопросу. Спасибо


person serena    schedule 01.11.2010    source источник


Ответы (14)


Попробуйте удалить ограничение заголовка для Accept, поставьте точку останова и посмотрите, каково фактическое значение. Или сделайте это с помощью FireBug.

Также взгляните на эту проблему jquery

person Bozho    schedule 01.11.2010
comment
Большое спасибо. Согласно статье, для заголовка accept должно быть установлено значение /. поэтому я обновил сопоставление запросов на: @RequestMapping(value =/working, headers=Accept=*/*, method=RequestMethod.GET) и теперь это работает :)) - person serena; 01.11.2010

Чтобы вернуть ответ JSON из @ResponseBody-аннотированного метода, вам нужны две вещи:

  • <mvc:annotation-driven /> (у вас это уже есть)
  • Jackson JSON Mapper в пути к классам

Вам не нужны ContentNegotiatingViewResolver и headers в @RequestMapping.

person axtavt    schedule 01.11.2010
comment
Я удалил информацию ContentNegotiatingViewResolver и заголовков, но она все еще не работает. Когда вы говорите о пути к классам, значит ли это, что мне нужно импортировать библиотеки Джексона? Если да, то они у меня включены. - person serena; 01.11.2010
comment
Тогда в вашем вопросе есть непонятная вещь: как app-config.xml связан с конфигурацией DispatcherServlet ...-servlet.xml? - person axtavt; 01.11.2010
comment
в web.xml я указываю сервлет, затем app-config.xml (contextConfigLocation): ‹servlet› ‹servlet-name›dispatcher‹/servlet-name› ‹servlet-class›org.springframework.web.servlet.DispatcherServlet‹ /servlet-class› ‹init-param› ‹param-name›contextConfigLocation‹/param-name› ‹param-value›/WEB-INF/app-config.xml‹/param-value› ‹/init-param› ‹ загрузка при запуске›1‹/загрузка при запуске› ‹/сервлет› - person serena; 01.11.2010
comment
Это была моя проблема! У меня был jackson-mapper-lgpl. Мне нужно было изменить это на артефакт Id jackson-mapper-lgpl. - person Alex; 18.05.2012
comment
@atc Пожалуйста, объясни мне, что ты сделал - person Ram; 15.04.2013
comment
@atc Начальное и конечное значение для ArtiftId одинаково - person Ram; 15.04.2013
comment
Добавление jackson json mapper к моим зависимостям maven было для меня правильным решением - голосовать ++ - person Dieter Hubau; 24.07.2013
comment
Чувак, твоя идея была чертовски крута! Я использовал Spring Guide, как создать службу отдыха из: spring.io/guides/gs/rest -service Я не мог пройти через 406 без jackson-mapper-asl. Я думал, что руководство с официального сайта Spring будет полным, но, к сожалению, это не так. ЕЩЕ РАЗ СПАСИБО! - person bpawlowski; 29.10.2013
comment
Я добавил jackson-mapper-asl в свои зависимости maven. Я вижу 2 банки jackon, перечисленные в моих зависимостях Maven, что заставляет меня думать, что я сделал это правильно. Но я все еще получаю 406. Что мне не хватает? - person Doo Dah; 31.03.2014
comment
Зависимость от Maven, которая меня спасла:‹dependency› ‹groupId›org.codehaus.jackson‹/groupId› ‹artifactId›jackson-mapper-asl‹/artifactId› ‹version›1.9.13‹/version› ‹/dependency› - person Spiff; 17.07.2014

У меня возникла эта проблема после того, как я обновил Spring до 4.1.x с 3.2.x. Я исправил, обновив Jackson с 1.9.x до 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>
person jprism    schedule 04.01.2015
comment
Спасибо, чувак, проблема сводила меня с ума! - person Jacob van Lingen; 21.07.2015

Добавьте org.springframework.http.converter.json.MappingJacksonHttpMessageConverter и org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter в DispatcherServlet-servlet.xml. и обратитесь к первому во втором, используя

<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>
person Thomas    schedule 26.09.2013
comment
Большое спасибо, это сработало для меня! Единственное изменение состоит в том, чтобы переименовать MappingJacksonHttpMessageConverter в MappingJackson2HttpMessageConverter в вашем фрагменте, который есть в последней весенней версии — 4.2.0.RELEASE. - person vanval; 12.02.2016

Я тоже получил эту ошибку, и во время отладки глубоко в кроличьей норе я наткнулся на это исключение

java.lang.IllegalArgumentException: конфликтующие определения геттера для свойства «ошибка»: com.mycomp.model.OutputJsonModel#isError (0 params) vs com.mycomp.model.OutputJsonModel#getError (0 params)

Итак, в моем 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;
}

Изменение одного из имен переменных-членов ошибок на что-то другое решило проблемы.

person user320550    schedule 27.09.2012
comment
Спасибо, чувак, твой ответ заставил меня понять, что я забыл методы получения и установки. - person Dinei; 14.10.2015
comment
У меня такая же проблема. Убедитесь, что объект ответа имеет геттеры и сеттеры. - person Laurent Picquet; 15.11.2016

У меня тоже была эта проблема, вы должны добавить <mvc:annotation-driven /> в свою конфигурацию xml

и

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

в вашем pom.xml

person Stefanos T.    schedule 22.10.2014

Я использовал конфигурацию Java, и я получил ту же ошибку. Я пропустил добавление @EnableWebMvc в файл конфигурации. Эта ошибка устранена после того, как я добавил @EnableWebMvc в свой файл webconfig.

Также объект, который возвращается из вашего контроллера Spring, должен иметь правильные методы получения и установки.

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

    }

Также убедитесь, что возвращаемый объект имеет правильный геттер и сеттер.

Пример:

@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 должен иметь правильный геттер и сеттер. если нет, будет выдана ошибка 406.

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>
person Raghu    schedule 07.03.2016
comment
Для меня это также решило проблему, но я понятия не имею, почему? Любое объяснение? - person Shady; 14.07.2017

проблема не связана с jquery. даже ошибка говорит, что это проблема на стороне сервера. пожалуйста, убедитесь, что в пути к классу присутствуют следующие 2 jar: -

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

person Raju Rathi    schedule 01.06.2013
comment
Версия этого исправила это для меня, когда я переключился с 1.9.x jackson на 2.x (fasterxml). У меня было только импортированное ядро, но не аннотации или привязка данных. Я не был доволен удалением опции принятия. - person Chanoch; 02.05.2014

Я также столкнулся с этой же проблемой и загрузил этот [jar]: (http://www.java2s.com/Code/Jar/j/Downloadjacksonall190jar.htm)! и помещен в папку lib, и приложение работает как шарм :)

person Sivaguru Srinivas    schedule 09.08.2014
comment
Супер... Это дало мне решение. - person Silambarasan; 10.09.2014

См. мой ответ на аналогичную проблему здесь, где Spring MVC интерпретирует расширение URI и изменяет ожидаемый тип MIME, созданный за сцена, поэтому получается 406.

person Jérémie    schedule 11.05.2015

Что ж, ответы на этой странице могут быть правильными, но они недостаточно развернуты. Это то, что я сделал

Я добавил это в свой 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>

Затем я добавил заголовки в свой RequestMapping, как показано ниже.

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

Затем в моем 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);
            },
        });

Затем в моем сервлете я добавил

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

Если у вас есть проблемы с тегом util в вашем сервлете, просто добавьте в тот же файл сервлета

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

и

xsi:schemaLocation="http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
person Yinka    schedule 12.08.2018
comment
Если версия Spring ›4, вам нужно изменить class=org.springframework.http.converter.json.MappingJacksonHttpMessageConverter на class=org.springframework.http.converter.json.MappingJackson2HttpMessageConverter. Согласно andreagirardi.it/blog/ - person Nitish Patel; 08.02.2019

Как сказал axtavt, mvc:annotation-driven и jackson JSON mapper — это все, что вам нужно. Я последовал этому и заставил свое приложение возвращать строки JSON и XML из одного и того же метода без изменения кода, при условии, что в объекте, который вы возвращаете из контроллера, есть @XmlRootElement и @XmlElement. Разница заключалась в параметре accept, передаваемом в запросе или заголовке. Чтобы вернуть xml, это сделает любой обычный вызов из браузера, в противном случае передайте accept как «application/xml». Если вы хотите, чтобы возвращался JSON, используйте «application/json» в параметре accept в запросе.

Если вы используете firefox, вы можете использовать tamperdata и изменить этот параметр

person Iceman    schedule 31.08.2011

Используя jQuery, вы можете установить желаемый тип содержимого (application/json; charset=UTF-8' здесь) и установить тот же заголовок на стороне сервера.

НЕ ЗАБУДЬТЕ ОЧИСТИТЬ КЭШ ВО ВРЕМЯ ПРОВЕРКИ.

person user3055311    schedule 06.02.2014

Вместо @RequestMapping(...headers="Accept=application/json"...) используйте @RequestMapping(... , produces = "application/json")

person Daniel David Kovacs    schedule 07.12.2013