【问题标题】:How to resolve HTTP Status 406 in Spring MVC如何在 Spring MVC 中解决 HTTP 状态 406
【发布时间】:2019-02-07 15:00:20
【问题描述】:

我是初学者并尝试使用 spring MVC 创建 REST api,但我收到 HTTP 406 错误。我不知道代码出了什么问题。这是我的控制器。

RestController.Java

 package com.nitish.sample;
    @RestController
    public class LoginRESTController {

    @Autowired
    public LoginService loginService;

    @ResponseBody
    @RequestMapping(value = "/api/login",method = RequestMethod.GET,headers="Accept=*/*",produces = {MediaType.APPLICATION_JSON_VALUE}) 
    public List<Login> authentication(){        
        List<Login> login = loginService.getUser();     
        return login;
    }}

pom.xml

<dependencies>
<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.9.8</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>
</dependencies>

为了更清楚,我添加了 dispachet servlet 和 web.xml HelloWebSpring-servlet.xml

 <beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:context = "http://www.springframework.org/schema/context"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   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">

   <context:component-scan base-package = "com.nitish.sample" />   

   <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> -->
      <property name = "prefix" value = "/WEB-INF/jsp/" />
      <property name = "suffix" value = ".jsp" />
   </bean>


</beans>

web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>HelloWebSpring</display-name>

  <servlet>
      <servlet-name>HelloWebSpring</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
      <servlet-name>HelloWebSpring</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>  

</web-app>

这是服务器快照

【问题讨论】:

  • 尝试在您的@RequestMapping 中删除 headers="Accept=*/*"
  • 默认情况下,RestController 会产生 json 响应,因此您不需要产生 = {MediaType.APPLICATION_JSON_VALUE} 此外,从注释中删除 headers="Accept=*/*" 并给它试一试。另外请检查您是否已将@EnableWebMvc 添加到您的调度程序/servlet/mvc 配置中。
  • *注意:如果你在你的类中使用@RestController,那么类中的所有方法都是默认的@ResponseBody,你不需要添加它。
  • @Stefan 我已删除 header="Accept=*/* 并产生 = {MediaType.APPLICATION_JSON_VALUE} 但仍然面临问题。此外,我还没有在我的调度程序/servlet 配置中添加 EnableWebMvc。
  • @TrầnQuốcVũ 我已删除 header="Accept=*/* 但仍面临问题。

标签: spring spring-boot spring-mvc spring-security


【解决方案1】:

实际上,您应该尝试将其包装到 ResponseEntity 中。我会这样做:

@RequestMapping(value = "/api/login",method = RequestMethod.GET) 
public ResponseEntity<?> authentication(){        
    List<Login> login = loginService.getUser();     
    return new ResponseEntity<>(login, HttpStatus.OK);
}}

我认为这应该可行。

【讨论】:

  • 我已尝试使用您的代码,但仍然收到 HTTP 406。为了更好地理解,我上传了我的 dispatcher-servlet 和 web.xml
【解决方案2】:

以下是我想尝试的可能解决方案:

  1. 由于您使用的是@RestController,因此它在内部提供了@ResponseBody,因此您不必使用它,因此请删除@ResponseBody 注释。

  2. 尝试删除接受和生成属性,因为其余控制器内容类型是 JSON 本身。

  3. 此外,如果您使用邮递员或任何其他客户端发出请求,请确保在标头中添加内容类型。

希望对您有所帮助..!

【讨论】:

  • 根据您的评论,我已删除 @ResponseBody,并且正在使用邮递员或任何其他客户端发出请求。我只是从我的 Eclipse IDE 浏览器发出请求。
【解决方案3】:
  1. 删除标题=“Accept=/”。
  2. 在您的 HelloWebSpring-Servlet.xml 添加 mvc:annotation-driven

这将使 spring 配置你的@RestController。

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:context = "http://www.springframework.org/schema/context"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   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">

   <mvc:annotation-driven /> 
   <context:component-scan base-package = "com.nitish.sample" />   

   <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> -->
      <property name = "prefix" value = "/WEB-INF/jsp/" />
      <property name = "suffix" value = ".jsp" />
   </bean>


</beans>

mvc:annotation-driven 详情:https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-config

【讨论】:

  • 我在dispatcher.xml中添加了下面的代码 它对我有用。
  • 将 mvc:annotation-driven 添加到您的调度程序应该会自动执行您所做的事情。无论您做什么都是绝对正确的,但是 mvc:annotation-driven 会按照文档的建议为您做一些更默认的合理配置。它还将帮助您升级 Spring 版本,因为自 Spring 3.2 起已弃用 AnnotationMethodHandlerAdapter。
猜你喜欢
  • 2014-02-09
  • 1970-01-01
  • 2019-04-30
  • 2018-07-22
  • 2019-05-05
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多