Spring MVC + JSON = 406 Не допускается

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

 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

В tomcat / lib у меня есть все Tomcat jars, Spring jars и jackson-all-1.9.0.jar. Я использую Spring 3.2.2 с Tomcat 7.

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

web.xml

  Spring Web MVC Application  dispatcher  org.springframework.web.servlet.DispatcherServlet  1   dispatcher *.htm   

диспетчер-servlet.xml

    /WEB-INF/pages/   .jsp       

HelloWorldController.java

 package com.smiechmateusz.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; import com.smiechmateusz.dao.Foo; @Controller @RequestMapping("/") public class HelloWorldController extends AbstractController{ @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView model = new ModelAndView("HelloWorldPage"); return model; } @RequestMapping(value="foobar.htm", method = RequestMethod.GET) public @ResponseBody Foo getShopInJSON() { Foo f = new Foo(); f.setX(1); f.setY(2); f.setDescription("desc"); return f; } } 

Foo.java

 package com.smiechmateusz.dao; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="foobaz") public class Foo implements Serializable { private int x, y; String description; int id; @Column(name = "x") public int getX() { return x; } public void setX(int x) { this.x = x; } @Column(name = "y") public int getY() { return y; } public void setY(int y) { this.y = y; } @Column(name = "description") public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Id @GeneratedValue @Column(name = "id") public int getId() { return id; } public void setId(int id) { this.id = id; } } 

Я уже пытался добавить

         

к моему диспетчеру-servlet.xml или изменению jakcson-all на jackson-asl и jackson-core-asl, но вывод был таким же.

Accept: text / html, application / xhtml + xml, application / xml; q = 0,9, / ; q = 0,8

Это должно быть проблемой. JSON используется как application/json . Если вы соответствующим образом установите заголовок Accept, вы должны получить правильный ответ. (Есть плагины браузера, которые позволяют вам устанавливать заголовки, мне нравится «Плакат» для Firefox лучше всего)

Если вы используете Maven и последний код jacksonа, вы можете удалить всю конфигурацию, специфичную для Jackson, из ваших XML-файлов Spring конфигурации (вам все равно понадобится тэг с меткой ) и просто добавьте некоторые зависимости Jackson от вашего файла pom.xml. Ниже приведены примеры зависимостей. Это сработало для меня, и я использую:

  • Apache Maven 3.0.4 (r1232337; 2012-01-17 01: 44: 56-0700)
  • Версия org.springframework 3.1.2.RELEASE
  • spring-security version 3.1.0.RELEASE.

     ... ...  com.fasterxml.jackson.core jackson-core 2.2.3   com.fasterxml.jackson.core jackson-databind 2.2.3   com.fasterxml.jackson.core jackson-annotations 2.2.3  ... ... 

Еще один способ получить эту ошибку – создать class без публичных членов. 406 неприемлемо – это довольно бесполезное сообщение об ошибке в этом сценарии.

С Spring 4 вы добавляете @EnableWebMvc , например:

 @Controller @EnableWebMvc @RequestMapping(value = "/articles/action", headers="Accept=*/*", produces="application/json") public class ArticlesController { } 

Ни один из других ответов не помог мне.

Я читал десятки ответов Stackoverflow о 406 Не приемлемо, HttpMediaTypeNotAcceptableException, multipart file, ResponseBody, настройка Принимать заголовки, производит, потребляет и т. Д.

У нас была Spring 4.2.4 с SpringBoot и Jackson, настроенными в build.gradle:

 compile "com.fasterxml.jackson.core:jackson-core:2.6.7" compile "com.fasterxml.jackson.core:jackson-databind:2.6.7" 

Все маршруты работали отлично в наших других controllerах, и мы могли использовать GET, POST, PUT и DELETE. Затем я начал добавлять возможности многопользовательской загрузки файлов и создал новый controller. Маршруты GET работают нормально, но наши POST и DELETE этого не сделали. Независимо от того, как я пробовал разные решения отсюда в SO, я просто продолжал получать 406 Not Acceptable.

Затем, наконец, я наткнулся на этот ответ SO: Spring throwing HttpMediaTypeNotAcceptableException: Не удалось найти приемлемое представление из-за точки в URL-адресе

Прочитайте ответ Раниса и все комментарии.

Все это сводилось к нашим значениям @RequestMapping:

 @RequestMapping(value = "/audio/{fileName:.+}", method = RequestMethod.POST, consumes="multipart/*") public AudioFileDto insertAudio(@PathVariable String fileName, @RequestParam("audiofile") MultipartFile audiofile) { return audioService.insert(fileName, audiofile); } @RequestMapping(value = "/audio/{fileName:.+}", method = RequestMethod.DELETE) public Boolean deleteAudio(@PathVariable String fileName) { return audioService.remove(fileName); } 

Часть {fileName:.+} В значении @RequestMapping вызвала 406 недопустимых в нашем случае.

Вот код, который я добавил из ответа Раниса:

 @Configuration public class ContentNegotiationConfig extends WebMvcConfigurerAdapter { @Override void configureContentNegotiation(final ContentNegotiationConfigurer configurer) { // Turn off suffix-based content negotiation configurer.favorPathExtension(false); } } 

EDIT 29 августа 2016 года:

У нас возникли проблемы с использованием configurer.favorPathExtension(false) : статические изображения SVG перестали загружаться. После анализа мы обнаружили, что Spring начала отправлять SVG-файлы обратно в пользовательский интерфейс с использованием «application / octet-stream» типа контента вместо «image / svg + xml». Мы решили это, отправив fileName в качестве параметра запроса, например:

 @RequestMapping(value = "/audio", method = RequestMethod.DELETE) public Boolean deleteAudio(@RequestParam String fileName) { return audioService.remove(fileName); } 

Мы также удалили configurer.favorPathExtension(false) . Другим способом может быть кодирование имени файла в пути, но мы выбрали метод параметров запроса, чтобы избежать дополнительных побочных эффектов.

Используйте ниже зависимость в своем пом

  com.fasterxml.jackson.core jackson-databind 2.5.3  

Вам необходимо зарегистрировать привязку annotations для Jackson в вашем spring-mvc-config.xml, например:

         

Затем в вашем controllerе вы можете использовать:

 @RequestMapping(value = "/your_url", method = RequestMethod.GET, produces = "application/json") @ResponseBody 

Я полагаю, что проблема заключалась в использовании расширения * .htm в RequestMapping ( foobar.htm ). Попробуйте изменить его на footer.json или что-то еще.

Ссылка на правильный ответ: https://stackoverflow.com/a/21236862/537246

PS

Именно по манере Spring что-то делать по умолчанию, относительно того, что разработчики знают весь API весны от A до Z. А потом просто «406 неприемлемо» без каких-либо подробностей, а журналы Tomcat пустые!

См. Проблему с расширением. В зависимости от расширения пружина может определить тип содержимого. Если ваш URL-адрес заканчивается на .com, он отправляет text / html в качестве заголовка содержимого. Если вы хотите изменить это поведение Spring, используйте приведенный ниже код:

 @Configuration @Import(HibernateConfig.class) @EnableWebMvc // @EnableAsync() // @EnableAspectJAutoProxy @ComponentScan(basePackages = "com.azim.web.service.*", basePackageClasses = { WebSecurityConfig.class }, excludeFilters = { @ComponentScan.Filter(Configuration.class) }) public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false).favorParameter(true).parameterName("mediaType").ignoreAcceptHeader(true).useJaf(false) .defaultContentType(MediaType.APPLICATION_JSON).mediaType("xml", MediaType.APPLICATION_XML).mediaType("json", MediaType.APPLICATION_JSON); } @Bean(name = "validator") public Validator validator() { return new LocalValidatorFactoryBean(); } } 

Здесь мы устанавливаем для параметра favorPathExtension значение false и Default Content-type для Application / json. Примечание. Класс HibernateConfig содержит все компоненты.

Сегодня я тоже пережил одну и ту же проблему. В моем случае, в web.xml меня есть

   spring *.html  

у моего url есть расширение .html . Пример: .../getUsers.html . Но я возвращаю данные JSON в controller. .html будет по умолчанию устанавливать тип accept как html.

Поэтому я перешел к следующему:

web.xml:

  spring *.html *.json  

URL:

.../getUsers.json

Сейчас все работает нормально. Надеюсь, поможет.

Попробуйте добавить

 @RequestMapping(method = RequestMethod.GET,headers = {"Accept=text/xml, application/json"}) 

на getShopInJSON() .

Это сработало для меня.

Возможно, все поля вашего POJO нуждаются в Getter и Setter.

Я исправил это в соответствии с этой проблемой. ссылка: Spring MVC – HttpMediaTypeNotAcceptableException

И 406 не является полезным сообщением, чтобы исправить ошибку. Вы должны отлаживать коды и посмотреть, что такое Исключение на земле.

это из-за того, что объект неприемлем для jsp … используйте его

добавьте эту зависимость или любую другую отправленную преобразованную строку json в jsp …

например добавить это в пом

  com.google.code.gson gson 2.6.2  

и используйте такой код:

 @RequestMapping(value="foobar.htm", method = RequestMethod.GET) public @ResponseBody String getShopInJSON() { Foo f = new Foo(); f.setX(1); f.setY(2); f.setDescription("desc"); return new Gson().toJson(f); //converted object into json string }//return converted json string 

Похоже, вы пытаетесь создать / получить выход json. Я вижу две проблемы с вашим подходом. 1) Вы не указали приложение / json в заголовке Accept 2) Вам нужно указать output = “application / json” в вашем @RequestMapping

Я не мог видеть это как ответ здесь, поэтому я подумал, что хочу упомянуть, что я получил эту ошибку, используя весну 4.2, когда я случайно удалил getter / setter для classа, который я ожидал вернуть как Json.

Значение RequestMapping заканчивалось на .html, которое должно быть чем-то другим.

Я попытался изменить его на .json, и это сработало для меня.

У меня есть аналогичная проблема и разрешена с использованием кода ниже

 public class ProductList { private List productList = new ArrayList(); @JsonProperty("data") @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT) public List getProductList() { return productList; } public void setProductList(List productList) { this.productList = productList; } I am setting ProductList object in ResponseEntity object and returning from controller. 

Мой class был аннотирован с помощью JsonSerialize, а параметр include был установлен в JsonSerialize.Inclusion.NON_DEFAULT . Это заставило jacksonа определить значения по умолчанию для каждого свойства bean. У меня было свойство bean, которое возвращало int. Проблема в моем случае заключалась в том, что bean getter сделал вызов метода, который имеет тип возвращаемого возврата (т. Е. Общий метод). По какой-то нечетной причине этот код скомпилирован; он не должен компилироваться, потому что вы не можете использовать int для типа возвращаемого возврата. Я изменил «int» на «Integer» для этого свойства bean, и у меня больше нет 406. Честно говоря, теперь код не скомпилируется, если я сменил Integer на int.

Есть еще один случай, когда этот статус будет возвращен: если планшет Jackson не может понять, как сериализовать ваш компонент. Например, если у вас есть два метода доступа для одного и того же логического свойства, isFoo() и getFoo() .

удалил getFoo() и положил isFoo() . это сработало для меня.

  • Идея избежать этого spring.handlers / spring.schemas будет перезаписана при слиянии нескольких весенних зависимостей в одной банке
  • Весна не может автоподключить карту
  • Spring MVC @PathVariable получает усечение
  • Отдых с весны и корс
  • Лучший способ вставить сеанс Hibernate к весне 3
  • Spring + Hibernate: другой объект с тем же значением идентификатора уже был связан с сеансом
  • что это значит, когда говорят, что http не имеет
  • Разница между applicationContext.xml и spring-servlet.xml в Spring Framework
  • Spring 3.0 - Не удалось найти пространство имен SpringNamespaceHandler для пространства имен XML
  • Весной MVC
  • Почему это приложение Spring с настройкой на основе Java не работает должным образом
  • Interesting Posts

    Как установить новый «язык отображения» на Windows 8.1 Single Language?

    Существует ли какое-либо программное обеспечение для Windows XP для изменения порядка элементов на панели задач?

    Добавление видео с использованием ffmpeg

    «Автоматический» и «Автоматический (Задержка запуска)»

    Почему 128 == 128 возвращает false, но 127 == 127 возвращает true при преобразовании в обертки Integer?

    Почему ПК все еще требуют батареи CMOS?

    Почему нет специализации std :: shared_ptr ?

    Прокрутка файлов в папке в matlab

    Как установить цвет фона операции на белый программным путем?

    Как сделать отличный R воспроизводимый пример

    В выражении If-Else для возврата метода, если Else должно быть явно указано, если вместо него можно неявно следовать?

    Как часто ленточный тормоз LTO и возврат для полной записи?

    Есть ли способ подключить два компьютера с помощью USB?

    Экранные сеансы GNU мертвы после перезагрузки компьютера – как это исправить?

    Что «отсутствует» в выпусках Visual Studio 2008 Express?

    Давайте будем гением компьютера.