当前位置: 首页 > 知识库问答 >
问题:

406在Spring MVC中返回JSON时不可接受的错误

习旻
2023-03-14

我正在开发一个应用程序,它将被用作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作为公共方法。

最好的问候索拉夫

共有3个答案

田彬郁
2023-03-14

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。htmspring将优先考虑延期。在第2步中,我添加了contentNegotiationManager bean来覆盖它。

西门骁
2023-03-14

我的简单设置。希望这有点帮助

波姆。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) {

        }

    });
}
淳于飞鸾
2023-03-14

我可以用上面的代码解决这个问题。

问题是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