HttpRequestMethodNotSupportedException при попытке передать данные с помощью AJAX
Доброго времени суток, столкнулся с проблемой, которая бросает 405 ошибку. Это происходит при использовании любого метода, вот следующие фрагменты кода (в данном случае метод POST):
@Controller
@RequestMapping("/tickets")
public class SellTicketController {
@PostMapping(value = "/buy")
public String buyTickets(@RequestBody BuyTicketsDto buyTickets) {
// code
return "redirect:/home";
}
}
А вот код AJAX:
$.ajax({
type : "POST",
contentType : "application/json",
url : "/tickets/buy",
data : {
sessionId : id,
login : login,
price : price,
seats : seats
},
dataType : 'json',
success : function(result) {
},
error : function(e) {
}
});
В данном случае получаю следующую ошибку:
DEBUG 32 --- [nio-8000-exec-7] o.s.web.servlet.DispatcherServlet : "FORWARD" dispatch for POST "/redirect", parameters={}
WARN 32 --- [nio-8000-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]
DEBUG 32 --- [nio-8000-exec-7] o.s.web.servlet.DispatcherServlet : Exiting from "FORWARD" dispatch, status 405
DEBUG 32 --- [nio-8000-exec-7] o.s.web.servlet.DispatcherServlet : "ERROR" dispatch for POST "/error", parameters={}
DEBUG 32 --- [nio-8000-exec-7] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
DEBUG 32 --- [nio-8000-exec-7] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Using 'application/json', given [application/json, text/javascript, */*;q=0.01] and supported [application/json, application/*+json, application/json, application/*+json]
DEBUG 32 --- [nio-8000-exec-7] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Writing [{timestamp=Sun Jul 26 21:47:08 EEST 2020, status=405, error=Method Not Allowed, message=Request meth (truncated)...]
DEBUG 32 --- [nio-8000-exec-7] o.s.web.servlet.DispatcherServlet : Exiting from "ERROR" dispatch, status 405
BuyTicketsDto:
@Getter
@Setter
@Builder
@AllArgsConstructor
public class BuyTicketsDto {
@NotEmpty
private Long sessionId;
private String login;
@NotEmpty
private Integer price;
@NotEmpty
private JSONArray seats;
}
Конфигурационный файл:
@Configuration
public class AppConfig implements WebMvcConfigurer {
@Bean
public Java8TimeDialect java8TimeDialect() {
return new Java8TimeDialect();
}
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver clr = new CookieLocaleResolver();
clr.setDefaultLocale(Locale.ENGLISH);
clr.setCookieName("language");
return clr;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleChangeInterceptor());
}
}
А также pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<groupId>com.cinema.whiteblack</groupId>
<artifactId>whiteblack</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20200518</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
После обработки кода в любом случае должен быть редирект. Спасибо
Ответы (1 шт):
Автор решения: Alexandr
→ Ссылка
В подобных ситуациях в первую очередь смотрите DEBUG логи (org.springframework.web, org.springframework.security). POST запросы не будут разрешены, если включен CSRF и не передается CSRF токен с запросом.
Вам необходимо либо выключить CSRF, либо начать передавать CSRF токен.
Обсуждения на данную тему: