Spring Boot POST请求被识别为静态资源的问题求助
解决Spring Boot请求被当作静态资源处理的问题
问题重现
发送POST请求:
POST http://localhost:8080/bookings/newBooking Content-Type: application/json { "bookingId": 1, "user": { "userId": 3, "username": "user1", "password": "password1", "email": "name@mail.com" }, "paymentId": 4 }
收到错误:
"org.springframework.web.servlet.resource.NoResourceFoundException: No static resource bookings/newBooking.
org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585).org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)..."
相关代码
BookingController
package org.soa.booking; @RestController @RequestMapping("/bookings") public class BookingController { private final BookingService bookingService; @Autowired public BookingController(BookingService bookingService) { this.bookingService = bookingService; } @PostMapping("/newBooking") public Booking createBooking(@RequestBody Booking booking) { return bookingService.createBooking(booking); } }
SoaApplication
package org.soa; @SpringBootApplication @RestController public class SoaApplication { public static void main(String[] args){ SpringApplication.run(SoaApplication.class, args); } }
build.gradle
plugins { id 'java' id 'org.springframework.boot' version '3.3.4' id 'io.spring.dependency-management' version '1.1.6' } group = 'org.soa' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'javax.persistence:javax.persistence-api:2.2' implementation 'org.mariadb.jdbc:mariadb-java-client:3.0.5' } sourceSets { main { java { exclude 'org/soa/passenger/**' exclude 'org/soa/flight/**' exclude 'org/soa/payment/**' exclude 'org/soa/airport/**' } } } tasks.named('test') { useJUnitPlatform() }
解决思路
- 确认组件扫描范围:
@SpringBootApplication默认扫描主类所在包及其子包,主类在org.soa,BookingController在org.soa.booking子包,理论上能被扫描到。可显式指定扫描范围确保覆盖:@SpringBootApplication(scanBasePackages = {"org.soa", "org.soa.booking"}) - 检查编译类是否存在:执行
./gradlew clean build,查看编译后的build/classes/java/main/org/soa/booking/目录下是否有BookingController.class,确认sourceSets配置未误排除该类。 - 验证请求正确性:用
curl命令测试,确保请求方法、路径、格式无错误:curl -X POST -H "Content-Type: application/json" -d '{"bookingId":1,"user":{"userId":3,"username":"user1","password":"password1","email":"name@mail.com"},"paymentId":4}' http://localhost:8080/bookings/newBooking - 确认Controller初始化:在
BookingController构造方法中添加日志输出,启动应用时查看控制台,确认Spring容器是否加载了该Controller。 - 调整静态资源优先级:若存在自定义
WebMvcConfigurer配置,确保API请求路径优先被Controller匹配,而非静态资源处理器。 - 替换冲突依赖:Spring Boot 3.x基于Jakarta EE,将
javax.persistence:javax.persistence-api:2.2替换为jakarta.persistence:jakarta.persistence-api:3.2.0,避免API兼容问题。
内容的提问来源于stack exchange,提问作者eberteo
相关产品推荐
相关产品推荐

