Я думаю, что это должно сделать трюк. Я просто добавил 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>';
}
}
?>
Accept: text / html, application / xhtml + xml, application / xml; q = 0.9, / ; q = 0.8
blockquote>должна быть проблема. JSON используется как
application/json
. Если вы соответствующим образом установите заголовок Accept, вы должны получить правильный ответ. (Есть плагины браузера, которые позволяют устанавливать заголовки, мне нравится «Плакат» для Firefox лучше всего)
это из-за того, что объект неприемлем для 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
Вам необходимо зарегистрировать привязку аннотации для 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
Есть еще один случай, когда этот статус будет возвращен: если диспетчер Jackson не может понять, как сериализовать ваш bean-компонент. Например, если у вас есть два метода доступа для одного и того же логического свойства, isFoo()
и getFoo()
.
удалены getFoo()
и поместите isFoo()
. это сработало для меня.
См. проблему с расширением. В зависимости от расширения пружина может определить тип содержимого. Если ваш 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 содержит все компоненты.
Похоже, вы пытаетесь создать / получить json-выход. Я вижу две проблемы с вашим подходом. 1) Вы не указали приложение / json в своем заголовке Accept 2) Вам нужно указать output = "application / json" в вашем @RequestMapping
Возможно, для всех полей вашего POJO нужны Getter и Setter.
Я исправил его в соответствии с этой проблемой. ссылка: Spring MVC - HttpMediaTypeNotAcceptableException
И 406 не является полезным сообщением для исправления ошибки. Вы должны отлаживать коды и видеть, что Исключение находится на земле.
Еще один способ получить эту ошибку - создать класс без публичных членов. 406 неприемлемым является довольно бесполезным сообщением об ошибке в этом сценарии.
Попробуйте добавить
@RequestMapping(method = RequestMethod.GET,headers = {"Accept=text/xml, application/json"})
в getShopInJSON()
.
Это сработало для меня.
Мой класс был аннотирован JsonSerialize, а параметр include был установлен на JsonSerialize.Inclusion.NON_DEFAULT
. Это заставило Джексона определить значения по умолчанию для каждого свойства bean. У меня было свойство bean, которое возвращало int. Проблема в моем случае заключалась в том, что bean getter обратился к методу, который имеет тип возвращаемого возврата (т. Е. Общий метод). По какой-то нечетной причине этот код скомпилирован; он не должен компилироваться, потому что вы не можете использовать int для типа возвращаемого возврата. Я изменил «int» на «Integer» для этого свойства bean, и у меня больше нет 406. Честно говоря, теперь код не скомпилируется, если я сменил Integer на int.
Я не мог видеть это как ответ здесь, поэтому я подумал, что хочу упомянуть, что я получил эту ошибку, используя весну 4.2, когда я случайно удалил геттер / сеттер для класса, который я ожидал вернуть как Json.
Если вы используете Maven и последний код Джексона , вы можете удалить всю конфигурацию, специфичную для Джексона, из ваших XML-файлов конфигурации Spring (вам все равно потребуется тег, mvc: annotation-driven / & gt;) и просто добавьте некоторые зависимости Jackson к вашему файлу pom.xml. Ниже приведены примеры зависимостей. Это сработало для меня, и я использую:
...<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>...
Используйте зависимость ниже в вашем pom
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
Значение моего RequestMapping
заканчивается на .html, который должен быть чем-то другим.
Я попытался изменить его на .json, и он сработал для меня.
У меня есть аналогичная проблема и разрешена с использованием ниже кода
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.
Сегодня я тоже пережил ту же проблему. В моем случае, в 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
Теперь все работает нормально. Надеюсь, что это поможет.
С помощью Spring 4 вы добавляете @EnableWebMvc
, например:
@Controller
@EnableWebMvc
@RequestMapping(value = "/articles/action", headers="Accept=*/*", produces="application/json")
public class ArticlesController {
}
<mvc:annotation-driven />
или через@EnableWebMvc
. См. этот предыдущий ответ моей для полного рабочего примера – Sean Patrick Floyd 2 May 2013 в 15:45