Java HTTP 状态 405 - 不支持请求方法“PUT”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35381402/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 16:36:58  来源:igfitidea点击:

HTTP Status 405 - Request method 'PUT' not supported

javaspringspring-mvc

提问by KostasC

I have the following controller:

我有以下控制器:

@RestController
public class RestaurantController {
    @Autowired
    RestaurantService restaurantService;
    @RequestMapping(value = "/restaurant/", method = RequestMethod.GET)
    public ResponseEntity<List<Restaurant>> listAllRestaurants() {
        System.out.println("Fetching all restaurants");
        List<Restaurant> restaurants = restaurantService.findAllRestaurants();
        if(restaurants.isEmpty()){
            return new ResponseEntity<List<Restaurant>>(HttpStatus.NO_CONTENT);//You many decide to return HttpStatus.NOT_FOUND
        }
        return new ResponseEntity<List<Restaurant>>(restaurants, HttpStatus.OK);
    }
    @RequestMapping(value = "/restaurant/{id}", method = RequestMethod.PUT)
    public ResponseEntity<Restaurant> updateRestaurant(@PathVariable("id") int id, @RequestBody Restaurant restaurant) {
        System.out.println("Updating Restaurant " + id);

        Restaurant currentRestaurant = restaurantService.findById(id);

        if (currentRestaurant==null) {
            System.out.println("Restaurant with id " + id + " not found");
            return new ResponseEntity<Restaurant>(HttpStatus.NOT_FOUND);
        }

        currentRestaurant.setName(restaurant.getName());
        currentRestaurant.setDescription(restaurant.getDescription());
        currentRestaurant.setIcon(restaurant.getIcon());

        restaurantService.updateRestaurant(currentRestaurant);
        return new ResponseEntity<Restaurant>(currentRestaurant, HttpStatus.OK);
    }
}

Here is my calls from the PostMan. First I am making the GET call to get all the restaurants and it works fine enter image description hereSecond I am trying to update the object by I am getting the following error. enter image description hereAt the Tomcat 8.0.32, I am getting the following log:

这是我从邮递员那里打来的电话。首先,我正在调用 GET 来获取所有餐厅,并且它工作正常 在此处输入图片说明其次我正在尝试更新对象,因为我收到以下错误。 在此处输入图片说明在 Tomcat 8.0.32 上,我收到以下日志:

13-Feb-2016 16:55:09.442 WARNING [http-apr-8080-exec-9] org.springframework.web.servlet.PageNotFound.handleHttpRequestMethodNotSupported Request method 'PUT' not supported

2016 年 2 月 13 日 16:55:09.442 警告 [http-apr-8080-exec-9] org.springframework.web.servlet.PageNotFound.handleHttpRequestMethodNotSupported 不支持请求方法“PUT”

I don't understand this is how possible. And here is my dependencies:

我不明白这怎么可能。这是我的依赖项:

<properties>
        <springframework.version>4.1.6.RELEASE</springframework.version>
        <springsecurity.version>4.0.1.RELEASE</springsecurity.version>
        <hibernate.version>4.3.6.Final</hibernate.version>
        <mysql.connector.version>5.1.31</mysql.connector.version>
        <Hymanson.version>2.6.3</Hymanson.version>
        <joda-time.version>2.3</joda-time.version>
        <testng.version>6.9.4</testng.version>
        <mockito.version>1.10.19</mockito.version>
        <h2.version>1.4.187</h2.version>
        <dbunit.version>2.2</dbunit.version>
    </properties>

    <dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- Hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>

        <!-- jsr303 validation -->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.1.3.Final</version>
        </dependency>

        <!-- MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.connector.version}</version>
        </dependency>

        <!-- Joda-Time -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>${joda-time.version}</version>
        </dependency>

        <!-- To map JodaTime with database type -->
        <dependency>
            <groupId>org.jadira.usertype</groupId>
            <artifactId>usertype.core</artifactId>
            <version>3.0.0.CR1</version>
        </dependency>
        <!-- Spring Security -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${springsecurity.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${springsecurity.version}</version>
        </dependency>
        <!-- Servlet+JSP+JSTL -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- Need this for json to/from object -->
        <dependency>
            <groupId>com.fasterxml.Hymanson.core</groupId>
            <artifactId>Hymanson-core</artifactId>
            <version>${Hymanson.version}</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.Hymanson.core</groupId>
            <artifactId>Hymanson-databind</artifactId>
            <version>${Hymanson.version}</version>
        </dependency>
        <!-- Testing dependencies -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${springframework.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>${testng.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>${mockito.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>${h2.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>dbunit</groupId>
            <artifactId>dbunit</artifactId>
            <version>${dbunit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

If more information is needed please tell me! Thanks.

如果需要更多信息,请告诉我!谢谢。

Edit 1:

编辑1:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Autowired
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("bill").password("user").roles("USER");
        auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN");
        auth.inMemoryAuthentication().withUser("dba").password("dba").roles("ADMIN","DBA");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

      http.authorizeRequests()
        .antMatchers("/", "/home","/restaurant/**").permitAll()
        .antMatchers("/list").access("hasRole('USER')")
        .antMatchers("/list").access("hasRole('ADMIN')")
        .antMatchers("/admin/**").access("hasRole('ADMIN')")
        .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
        .and().formLogin().loginPage("/login")
        .usernameParameter("ssoId").passwordParameter("password")
        .and().csrf()
        .and().exceptionHandling().accessDeniedPage("/Access_Denied");
    }
}

Edit 2:

编辑2:

2016-02-14 12:30:56 DEBUG FilterChainProxy:324 - /restaurant/1 at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'

2016-02-14 12:30:56 DEBUG FilterChainProxy:324 - /restaurant/1 at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'

2016-02-14 12:30:56 DEBUG HttpSessionSecurityContextRepository:159 - No HttpSession currently exists

2016-02-14 12:30:56 DEBUG HttpSessionSecurityContextRepository:101 - No SecurityContext was available from the HttpSession: null. A new one will be created.

2016-02-14 12:30:56 DEBUG FilterChainProxy:324 - /restaurant/1 at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'

2016-02-14 12:30:56 DEBUG HstsHeaderWriter:128 - Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@3ded3d8a

2016-02-14 12:30:56 DEBUG FilterChainProxy:324 - /restaurant/1 at position 4 of 12 in additional filter chain; firing Filter: 'CsrfFilter'

2016-02-14 12:30:56 DEBUG CsrfFilter:106 - Invalid CSRF token found for http://localhost:8080/SpringSecurityCusotmLoginFormAnnotationExample/restaurant/1

2016-02-14 12:30:56 DEBUG DispatcherServlet:861 - DispatcherServlet with name 'dispatcher' processing PUT request for [/SpringSecurityCusotmLoginFormAnnotationExample/Access_Denied]

2016-02-14 12:30:56 DEBUG RequestMappingHandlerMapping:294 - Looking up handler method for path /Access_Denied

2016-02-14 12:30:56 DEBUG ExceptionHandlerExceptionResolver:134 - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported

2016-02-14 12:30:56 DEBUG ResponseStatusExceptionResolver:134 - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported

2016-02-14 12:30:56 DEBUG DefaultHandlerExceptionResolver:134 - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported

2016-02-14 12:30:56 WARN PageNotFound:198 - Request method 'PUT' not supported

2016-02-14 12:30:56 DEBUG HttpSessionSecurityContextRepository:337 - SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.

2016-02-14 12:30:56 DEBUG DispatcherServlet:1034 - Null ModelAndView returned to DispatcherServlet with name 'dispatcher': assuming HandlerAdapter completed request handling

2016-02-14 12:30:56 DEBUG DispatcherServlet:996 - Successfully completed request

2016-02-14 12:30:56 DEBUG DefaultListableBeanFactory:248 - Returning cached instance of singleton bean 'delegatingApplicationListener'

2016-02-14 12:30:56 DEBUG HttpSessionSecurityContextRepository:337 - SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.

2016-02-14 12:30:56 DEBUG SecurityContextPersistenceFilter:105 - SecurityContextHolder now cleared, as request processing completed

2016-02-14 12:30:56 DEBUG FilterChainProxy:324 - /restaurant/1 在附加过滤器链中的第 1 个位置;触发过滤器:'WebAsyncManagerIntegrationFilter'

2016-02-14 12:30:56 DEBUG FilterChainProxy:324 - /restaurant/1 在附加过滤器链中的 12 个位置的第 2 个;触发过滤器:'SecurityContextPersistenceFilter'

2016-02-14 12:30:56 调试 HttpSessionSecurityContextRepository:159 - 当前不存在 HttpSession

2016 年 2 月 14 日 12:30:56 调试 HttpSessionSecurityContextRepository:101 - HttpSession 中没有可用的 SecurityContext:null。将创建一个新的。

2016-02-14 12:30:56 DEBUG FilterChainProxy:324 - /restaurant/1 在附加过滤器链中 12 个位置的第 3 个;发射过滤器:'HeaderWriterFilter'

2016-02-14 12:30:56 DEBUG HstsHeaderWriter:128 - 不注入 HSTS 标头,因为它与 requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@3ded3d8a 不匹配

2016-02-14 12:30:56 DEBUG FilterChainProxy:324 - /restaurant/1 在附加过滤器链中 12 个位置的第 4 个;发射过滤器:'CsrfFilter'

2016-02-14 12:30:56 DEBUG CsrfFilter:106 - 为http://localhost:8080/SpringSecurityCusotmLoginFormAnnotationExample/restaurant/1找到无效的 CSRF 令牌

2016 年 2 月 14 日 12:30:56 DEBUG DispatcherServlet:861 - DispatcherServlet 名为“dispatcher”,正在处理 [/SpringSecurityCusotmLoginFormAnnotationExample/Access_Denied] 的 PUT 请求

2016-02-14 12:30:56 DEBUG RequestMappingHandlerMapping:294 - 查找路径 /Access_Denied 的处理程序方法

2016 年 2 月 14 日 12:30:56 DEBUG ExceptionHandlerExceptionResolver:134 - 解析处理程序的异常 [null]:org.springframework.web.HttpRequestMethodNotSupportedException:不支持请求方法“PUT”

2016 年 2 月 14 日 12:30:56 DEBUG ResponseStatusExceptionResolver:134 - 解析处理程序的异常 [null]:org.springframework.web.HttpRequestMethodNotSupportedException:不支持请求方法“PUT”

2016 年 2 月 14 日 12:30:56 DEBUG DefaultHandlerExceptionResolver:134 - 解析处理程序的异常 [null]:org.springframework.web.HttpRequestMethodNotSupportedException:不支持请求方法“PUT”

2016-02-14 12:30:56 WARN PageNotFound:198 - 不支持请求方法“PUT”

2016-02-14 12:30:56 DEBUG HttpSessionSecurityContextRepository:337 - SecurityContext 为空或内容是匿名的 - 上下文不会存储在 HttpSession 中。

2016-02-14 12:30:56 DEBUG DispatcherServlet:1034 - Null ModelAndView 返回给 DispatcherServlet,名为“dispatcher”:假设 HandlerAdapter 完成请求处理

2016-02-14 12:30:56 DEBUG DispatcherServlet:996 - 成功完成请求

2016-02-14 12:30:56 DEBUG DefaultListableBeanFactory:248 - 返回单例 bean 'delegatingApplicationListener' 的缓存实例

2016-02-14 12:30:56 DEBUG HttpSessionSecurityContextRepository:337 - SecurityContext 为空或内容是匿名的 - 上下文不会存储在 HttpSession 中。

2016-02-14 12:30:56 DEBUG SecurityContextPersistenceFilter:105 - SecurityContextHolder 现在被清除,因为请求处理完成

采纳答案by whistling_marmot

Try turning up the logging level for org.springframework.webto DEBUG. This will give you some insight into how Spring is trying to deal with the request. Hopefully, it will give you (or us) some more clues on how to fix it.

尝试调高org.springframework.webto的日志记录级别DEBUG。这将使您深入了解 Spring 如何处理请求。希望它会给您(或我们)更多有关如何修复它的线索。

If you're using Spring Boot, just add this line to your application.propertiesfile:

如果您使用的是 Spring Boot,只需将此行添加到您的application.properties文件中:

logging.level.org.springframework.web=DEBUG

Edit after seeing additional logging:

看到额外的日志后编辑:

The 'PUT' not supported message is a bit misleading. The real problem comes before that. You don't have a valid CSRF token. How are you submitting the request? It looks like you are using the PostMantool (but I am not familiar with this tool) rather than submitting the form directly from a web-page. There may be some way that you can add the token to your request using the tool. Does it work without the tool - submitting the form directly from the web-page?

'PUT' not supported 消息有点误导。真正的问题在那之前就出现了。您没有有效的 CSRF 令牌。你是如何提交请求的?看起来您正在使用PostMan工具(但我不熟悉此工具),而不是直接从网页提交表单。您可以通过某种方式使用该工具将令牌添加到您的请求中。它是否可以在没有工具的情况下工作 - 直接从网页提交表单?

回答by hahn

instead of sending request to /restaurant/1/, send it to /restaurant/1

而不是发送请求到/restaurant/1/,将其发送到/restaurant/1

回答by Rites

By default, in WebMvcAutoConfiguration, HttpPutFormContentFilteris not configured and hence the issue.

默认情况下,在WebMvcAutoConfigurationHttpPutFormContentFilter未配置,因此这个问题。

Its fixed in spring boot [1.3.0)version and working fine. So, you may try updating your spring-boot version or configure this filter manually to make things work.

它在 spring 引导[1.3.0)版本中固定并且工作正常。因此,您可以尝试更新 spring-boot 版本或手动配置此过滤器以使其正常工作。

Issue reference.
Another Stackoverlow reference

问题参考
另一个 Stackoverlow 参考

Hope it helps.

希望能帮助到你。

回答by progonkpa

I had the same error but for me it was caused by the fact that I had ommited the ID as URL parameter. I ommited it because the ID was present in the JSON body.

我有同样的错误,但对我来说这是因为我将 ID 作为 URL 参数省略了。我省略了它,因为 ID 存在于 JSON 正文中。

When I changed .../restaurant to ...restaurant/1, the error went away.

当我将 .../restaurant 更改为 ...restaurant/1 时,错误消失了。

回答by medTech

If you don't need csrf you can do this.

如果您不需要 csrf,则可以执行此操作。

@Configuration
@EnableWebSecurity
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
}

}

}

回答by Jag

I think your Model should implement Serializable interface and should have a default constructor.

我认为你的模型应该实现 Serializable 接口并且应该有一个默认的构造函数。

For me issue was solved by adding above to my Model class and @RequestBody to the Controller method argument.

对我来说,问题是通过将上面添加到我的 Model 类和 @RequestBody 到 Controller 方法参数来解决的。