我正在开发一个应用程序,它将被用作restful服务,响应必须以JSON的形式返回。y p
我正在使用Spring MVC,并遵循本文来实现同样的目标
https://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/
我在POM中添加了Jackson jar,启用了响应体和mvc注释驱动的注释。但还是在启动url时,我得到了406个不可接受的错误。
我曾尝试使用rest客户端启动,并为内容类型添加请求头,并使用“application/json”接受。
下面是我的POM和依赖部分
<!-- Spring 3 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.10</version>
</dependency>
我的Spring配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:annotation-driven />
<context:component-scan base-package="com.sap.cf.casestudy.controller" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
我的控制器代码
import java.util.ArrayList;
import java.util.List;
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 com.sap.cf.casestudy.domain.Employee;
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@RequestMapping(method = RequestMethod.GET ,headers="Accept=application/json")
public @ResponseBody Employee getEmployee() {
List<Employee> empList = getEmployeeData();
return empList.get(0);
//return "employeelist";
}
private List<Employee> getEmployeeData(){
List<Employee> employeeList = new ArrayList<Employee>();
Employee emp1 = new Employee();
emp1.setFirstName("Saurav");
emp1.setLastName("Sarkar");
employeeList.add(emp1);
Employee emp2 = new Employee();
emp2.setFirstName("John");
emp2.setLastName("Doe");
employeeList.add(emp1);
return employeeList;
}
}
此外,我还有一个employee类的POJO,firstname和lastname作为私有方法,setter/getter作为公共方法。
最好的问候索拉夫
Spring 4.3.10:我使用以下设置来解决问题。
步骤1:添加以下依赖项
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.6.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.7</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
第2步:在您的MVC DispatcherServlet上下文配置中添加以下内容:
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
<bean id="contentNegotiationManager"
class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false"/>
<property name="favorParameter" value="true"/>
<property name="ignoreAcceptHeader" value="false" />
</bean>
从spring 3.2开始,根据默认配置,如果请求uri有任何适当的扩展,比如,则favorPathExtension设置为true。htm
spring将优先考虑延期。在第2步中,我添加了contentNegotiationManager bean来覆盖它。
我的简单设置。希望这有点帮助
波姆。xml
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.3</version>
</dependency>
servlet上下文。xml
<!-- DispatcherServlet Context: defines this servlet's request-processing
infrastructure -->
<context:component-scan base-package="com.urong.sample" />
<!-- Enables the Spring MVC @Controller programming model -->
<mvc:annotation-driven>
<mvc:message-converters>
<beans:bean
class="org.springframework.http.converter.StringHttpMessageConverter">
<beans:property name="supportedMediaTypes">
<beans:list>
<beans:value>text/html;charset=UTF-8</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
<!-- Handles HTTP GET requests for /resources/** by efficiently serving
up static resources in the ${webappRoot}/resources directory -->
<mvc:resources location="/resources/" mapping="/resources/**" />
<mvc:default-servlet-handler />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources
in the /WEB-INF/views directory -->
<!-- Your Resolves -->
控制器
@RequestMapping(value = "/call", method = RequestMethod.POST)
public @ResponseBody String callTest(@RequestBody CompanyLocation location) {
// use location. this sample object
return "your return String";
}
客户端(我的javascript)
function callTest() {
var companyIdx = $('#companyIdx').val();
var locationIdx = $('#locationIdx').val();
var data = {
idx : locationIdx,
postCode : $('#postCode').val(),
address : $('#address').val(),
detailAddress : $('#detailAddress').val(),
tel : $('#tel').val(),
fax : $('#fax').val(),
email : $('#email').val(),
language : $("#language").val(),
latitude : $('#latitude').val(),
longtitude : $('#longtitude').val()
};
data = JSON.stringify(data);
$.ajax({
url : "/sample/call,
type : 'POST',
data : data,
contentType : 'application/json',
success : function(response) {
// use response.
},
error : function(request, status, error) {
},
complete : function(data) {
}
});
}
我可以用上面的代码解决这个问题。
问题是jackson mapper jar在类路径中不存在,所以它不起作用。
在Eclipse For Maven项目中,您必须强制更新,以便jar可以进入类路径。
理想情况下,spring框架中应该有一个关于未加载类的错误。这个错误本身就具有误导性。
最好的问候索拉夫
问题内容: 我正在尝试生成一个简单的JSON响应。现在,我收到406 Not Acceptable错误。Tomcat说:“此请求标识的资源只能根据请求“接受”标头生成特性不可接受的响应。” 即使我的标题是 在tomcat / lib中,我拥有所有的Tomcat jar,Spring jar和jackson-all-1.9.0.jar。我在Tomcat 7中使用Spring 3.2.2。 我知道这个
我正在尝试生成一个简单的JSON响应工作。现在我收到406不接受错误。Tomcat说“此请求标识的资源仅能够根据请求“接受”标头生成具有不可接受特征的响应。”即使我的标头是 在tomcat/lib中,我有所有的tomcat罐子、Spring罐子和jackson-all-1.9.0。罐子我将Spring 3.2.2用于Tomcat 7。 我知道这个问题已经讨论过很多次了,但是没有一个解决方案对我有用
Spring允许在中定义。 我已经在那里为HTTP 400、404、405等定义了许多其他异常处理程序,。。。然而,HTTP 406的ExceptionHandler(不可接受)似乎不起作用。处理程序被触发,我在日志中对此进行了检查,但没有使用结果。 我的目标是返回一个带有JSON主体的HTTP 406。 变型1 变体2 但是我总是从Tomcat得到类似的超文本标记语言响应: HTTP状态406-
我正在编写一个使用Java和Apache HttpClient的播客下载器。它适用于大多数RSS提要,但这一个失败了,出现了“406不可以接受”的错误。 链接是http://sqrpt.com/feed/podcast/
问题内容: 这是我的javascript: 这是我的控制器: spring-servlet.xml 收到此错误: 标头: 响应标题 请求标题 有趣的注意事项: 我收到406错误,但休眠查询同时起作用。 每当我在保管箱中更改选择时,这就是tomcat日志所说的: 可能是什么问题?之前在SO中有两个类似的问题,我在那里尝试了所有被接受的提示,但是我猜它们没有起作用… 有什么建议?随意问的问题… 问题答
问题内容: 我正在使用Ajax简化Spring 3.0文章中指定的带有JSON的Spring MVC 。 根据各种论坛上的建议对我的代码进行了无数次尝试和修改之后,我的代码仍然无法正常工作。 我继续收到以下错误:(406)根据请求“接受”标头(),此请求标识的资源只能生成特性不可接受的响应。 根据需要,我在appconfig.xml中。 app-config.xml mvc-config.xml