HTTP 406 - неприемлемо При использовании RestController Spring MVC 4.0.6 [duplicate]

Я думаю, что это должно сделать трюк. Я просто добавил if(isset и добавил конкатенацию к переменным в теле, чтобы отделить PHP от HTML.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = 'contact@yoursite.com'; 
    $subject = 'Customer Inquiry';
    $body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;

if (isset($_POST['submit'])) 
{
    if (mail ($to, $subject, $body, $from)) 
    { 
        echo '<p>Your message has been sent!</p>';
    } 
    else 
    { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}

?>
49
задан Roman C 19 March 2016 в 11:15
поделиться

18 ответов

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

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

17
ответ дан Sean Patrick Floyd 22 August 2018 в 08:56
поделиться
  • 1
    Это ничего не меняет, я все еще получаю ошибку 406. – Mateusz 2 May 2013 в 13:35
  • 2
    @Mateusz вы также должны правильно настроить весенний mvc, как пишет alain.janinm. Самый простой способ сделать это - через <mvc:annotation-driven /> или через @EnableWebMvc. См. этот предыдущий ответ моей для полного рабочего примера – Sean Patrick Floyd 2 May 2013 в 15:45
  • 3
    Большое вам спасибо, с вашим предыдущим сообщением, которому я, наконец, удалось заставить его работать. – Mateusz 2 May 2013 в 16:58

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

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

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

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

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

@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
1
ответ дан aditya Goyal 22 August 2018 в 08:56
поделиться
  • 1
    Добавление зависимости для gson помогает решить мою проблему. – David 30 August 2016 в 10:04

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

<!-- activates annotation driven binding -->
<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" validator="validator">
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>

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

@RequestMapping(value = "/your_url", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
5
ответ дан alain.janinm 22 August 2018 в 08:56
поделиться

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

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

0
ответ дан Alex M 22 August 2018 в 08:56
поделиться
  • 1
    Да. Это работает для меня. @RequestMapping (method = RequestMethod.GET, headers = {"Accept = text / xml, application / json & quot;}) – sats 28 March 2016 в 19:38

См. проблему с расширением. В зависимости от расширения пружина может определить тип содержимого. Если ваш 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 содержит все компоненты.

2
ответ дан Azim 22 August 2018 в 08:56
поделиться

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

0
ответ дан Balaji Katika 22 August 2018 в 08:56
поделиться

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

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

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

7
ответ дан Community 22 August 2018 в 08:56
поделиться

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

19
ответ дан Doo Dah 22 August 2018 в 08:56
поделиться
  • 1
    Это именно то, с чем я столкнулся. Очень запутанное сообщение об ошибке. – Jianwu Chen 28 January 2016 в 04:20
  • 2
    Hooray для бесполезных сообщений об ошибках. Это очень помогло. – The Head Rush 2 February 2016 в 16:31
  • 3
    да, это была проблема в моем случае, сделал публичный сеттер getter для свойств – anshulkatta 30 May 2016 в 10:09

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

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

в getShopInJSON().

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

1
ответ дан eebbesen 22 August 2018 в 08:56
поделиться

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

0
ответ дан Jared Simon 22 August 2018 в 08:56
поделиться

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

0
ответ дан jwv 22 August 2018 в 08:56
поделиться
  • 1
    Да. Это работает для меня. Спасибо Shubham @RequestMapping (method = RequestMethod.GET, headers = {"Accept = text / xml, application / json & quot;}) – sats 28 March 2016 в 19:39

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

  • Apache Maven 3.0.4 (r1232337; 2012-01-17 01: 44: 56-0700)
  • org. springframework version 3.1.2.RELEASE
  • spring-security version 3.1.0.RELEASE.
    ...<dependencies>
    ...
        <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>
        ...
    </dependencies>...
    
38
ответ дан KSev 22 August 2018 в 08:56
поделиться
  • 1
    Привет, я все еще сталкиваюсь с проблемой с некоторыми разными объектами – Dharmesh 24 March 2015 в 08:30
  • 2
    @Dharmesh - Мне нужна дополнительная информация, чем то, что вы мне дали в своем комментарии, чтобы помочь вам. Возможно, вы можете задать вопрос с полными подробностями, а затем направлять меня на этот вопрос в ваш следующий комментарий. Удачи! – KSev 24 March 2015 в 17:20
  • 3
    Я решаю проблему. В моем случае это очень маленькая ошибка, я не предоставляю getter и setter для 1 поля в классе Object, потому что это дает мне ошибку 406 при попытке конвертировать мой объект в тело ответа JSON с помощью аннотации @ResponseBody. – Dharmesh 25 March 2015 в 07:31

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

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.3</version>
</dependency>
6
ответ дан Nirbhay Rana 22 August 2018 в 08:56
поделиться

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

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

0
ответ дан piyushj 22 August 2018 в 08:56
поделиться

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

public class ProductList {

    private List<Product> productList =  new ArrayList<Product>();

    @JsonProperty("data")
    @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT)
    public List<Product> getProductList() {
        return productList;
    }
public void setProductList(List<Product> productList) {
        this.productList = productList;
    }

I am setting ProductList object in ResponseEntity object and returning from controller.
0
ответ дан Sachin 22 August 2018 в 08:56
поделиться

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

   <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

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

Итак, я изменил на следующее:

web.xml:

<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>*.html</url-pattern>
    <url-pattern>*.json</url-pattern>
</servlet-mapping>

URL:

.../getUsers.json

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

2
ответ дан vissu 22 August 2018 в 08:56
поделиться

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

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

}
9
ответ дан William Price 22 August 2018 в 08:56
поделиться
8
ответ дан Community 5 November 2018 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: