Ответ 1
Попробуйте удалить ограничение заголовка для Accept
, поместите контрольную точку и посмотрите, какое фактическое значение. Или сделайте это с помощью FireBug.
Также рассмотрите эту проблему jquery
Я использую Spring MVC с JSON, как указано в Ajax Simplification Spring 3.0.
После стольких попыток и вариантов моего кода, в зависимости от рекомендаций, найденных на разных форумах, мой код по-прежнему не работает.
Я продолжаю получать следующую ошибку: (406) Ресурс, идентифицированный этим запросом, способен генерировать ответы с характеристиками, недопустимыми в соответствии с заголовками запроса "accept" ().
У меня есть в моем 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 call
function convertToDecimal(){
$.getJSON("convert/working", {key: "r"}, function(aConversion){
alert("it worked.");
$('#decimal').val(aConversion.input);
});
}
Я был бы признателен за любые материалы по этой проблеме. Спасибо вам
Попробуйте удалить ограничение заголовка для Accept
, поместите контрольную точку и посмотрите, какое фактическое значение. Или сделайте это с помощью FireBug.
Также рассмотрите эту проблему jquery
Чтобы вернуть ответ JSON от @ResponseBody
-номененного метода, вам понадобятся две вещи:
<mvc:annotation-driven />
(у вас уже есть)Вам не нужны ContentNegotiatingViewResolver
и headers
в @RequestMapping
.
У меня была эта проблема после обновления Spring до 4.1.x от 3.2.x. Я исправил обновление Джексона с 1.9.x до 2.2.x(quickxml)
<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>
Добавьте 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>
У меня тоже была эта ошибка, и во время отладки в глубь кролика я столкнулся с этим исключением
java.lang.IllegalArgumentException: конфликтующие определения getter для свойства "error": 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;
}
Изменение одного из имен переменных члена ошибки на что-то еще решило проблемы.
У меня тоже была эта проблема, вам нужно добавить <mvc:annotation-driven />
в вашу конфигурацию xml
и
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.databind-version}</version>
</dependency>
в вашем pom.xml
Я использовал конфигурацию java, и я получил эту же ошибку. Я пропустил добавить @EnableWebMvc в файл конфигурации. Эта ошибка разрешается после добавления @EnableWebMvc в файл webconfig.
Также объект, возвращаемый с вашего контроллера Spring, должен иметь правильные методы 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
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>
проблема не связана с jquery. даже ошибка говорит, что это проблема на стороне сервера. убедитесь, что в классе есть следующие 2 баночки: -
джексон-ядро-ASL-1.9.X.jar джексон-картостроитель-ASL-1.9.X.jar
Я также столкнулся с этой же проблемой, и я загрузил эту [jar]: (http://www.java2s.com/Code/Jar/j/Downloadjacksonall190jar.htm)! и помещается в папку lib, и приложение работает как шарм:)
См. мой ответ на аналогичную проблему здесь с помощью Spring MVC, интерпретирующего расширение URI и изменение ожидаемого типа MIME, созданного позади сцены, поэтому создавая 406.
Как сказано в инструкции axtavt, mvc: annotation-driven и jackson JSON - это все, что вам нужно. Я последовал за этим и получил мое приложение, чтобы возвращать строки JSON и XML из одного и того же метода без изменения какого-либо кода при условии, что в объекте, который вы возвращаете с контроллера, есть @XmlRootElement и @XmlElement. Разница заключалась в параметре accept, переданном в запросе или заголовке. Чтобы вернуть xml, любой обычный вызов из браузера сделает это, иначе передайте accept как "application/xml". Если вы хотите вернуть JSON, используйте "application/json" в параметре accept в запросе.
Если вы используете firefox, вы можете использовать tamperdata и изменить этот параметр
Вместо @RequestMapping(...headers="Accept=application/json"...)
используйте @RequestMapping(... , produces = "application/json")
Используя jQuery, вы можете установить contentType на желаемый (application/json; charset = UTF-8 здесь) и установить тот же заголовок на стороне сервера.
ПОМНИТЕ, ЧТОБЫ ОСУЩЕСТВЛЯТЬ КАЧЕСТВО В ТЕЧЕНИИ.