Spring Boot REST API 生成 404 Not Found

Posted

技术标签:

【中文标题】Spring Boot REST API 生成 404 Not Found【英文标题】:Spring Boot REST API Generates 404 Not Found 【发布时间】:2018-12-10 08:41:09 【问题描述】:

我正在尝试执行连接到 mysql (phpmyadmin) 数据库的 Spring Boot 应用程序。问题是当我尝试获取、删除或发布数据时,它会生成此消息。


  "timestamp": "2018-07-02T06:36:37.000+0000",
  "status": 404,
  "error": "Not Found",
  "message": "No message available",
  "path": "/api/users"

主类:

public class App extends SpringBootServletInitializer 

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) 
        return application.sources(App.class);
    
    public static void main( String[] args )
    
        System.out.println( "Hello World!" );
        SpringApplication.run(App.class, args);
    

依赖关系:

<dependencies>
      <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
        </dependency>
        <dependency>
            <groupId>com.nulab-inc</groupId>
            <artifactId>zxcvbn</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.nekohtml</groupId>
            <artifactId>nekohtml</artifactId>
            </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.191</version>
        </dependency>
    </dependencies>

Application.properties

    spring.datasource.url = jdbc:mysql://localhost:3306/demo_db?useSSL=false
    spring.datasource.username=root
    spring.datasource.password=root
    spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
    spring.jpa.hibernate.ddl-auto=create
    spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
    spring.datasource.driverClassName=com.mysql.jdbc.Driver
    spring.jpa.generate-ddl=true
    spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

用户控制器:

@RestController
@RequestMapping("/api")
public class UserController 

    @Autowired
    UserRepository userRepoObject;

    @GetMapping("/users")
    public List<User> getAllUsers()
        return userRepoObject.findAll();
    

    @PostMapping("/users")
    public User createUser(@Valid @RequestBody User userObj) 
        return userRepoObject.save(userObj);
    

    @GetMapping("/users/id")
    public User getUser(@PathVariable(value = "id") Long userId) 
        return userRepoObject.findById(userId)
                .orElseThrow(() -> new ResourceNotFoundException("User", "id", userId));
    

    @DeleteMapping("users/id")
    public ResponseEntity<?> deleteUser(@PathVariable(value="id") Long userId)
        User user = userRepoObject.findById(userId).orElseThrow(() -> new ResourceNotFoundException("User","id",userId));
        userRepoObject.delete(user);
        return ResponseEntity.ok().build();
    


除此之外,我的应用程序中还有 User、UserController 和 UserRepository 类。 demo_db 数据库和用户表已经在 phpmyadmin 中创建。

请帮我解决这个问题。非常感谢。

如需更多信息,请附上错误截图。

【问题讨论】:

告诉我们UserController 404 表示“找不到资源”,这意味着无法识别您的控制器类(查看启动日志输出)或请求与映射不匹配。 你的主班对我来说看起来不熟悉(这并不意味着它是错误的)。我正在为该类使用注释 SpringBootAplication 并且不扩展 SpringBootServletInitializer 并因此不覆盖方法。也许你试一试。 @Flocke 还是同样的错误。 在我的应用程序中,我使用了两个注释 SpringBootApplication 、 EnableAutoConfiguration 和 extends SpringBootServletInitializer 并且工作正常。 【参考方案1】:

将以下内容添加到您的 Main 类中:

@SpringBootApplication
@ComponentScan( "your controllers packages here", "other packages if you use them" )
@EnableJpaRepositories(basePackages = "your repo packages here")
@EntityScan(basePackages = "your entities")

如果你在其他地方定义了你的包,比如在第二个模块中,你需要手动添加它们。

【讨论】:

以上是关于Spring Boot REST API 生成 404 Not Found的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot REST API war 文件生成 404 错误

Spring Boot 1.4 - REST API 测试

当我进行 Rest api 调用时,使用 Spring Boot 动态创建列/表

使用Swagger生成Spring Boot REST客户端(支持Feign)(待实践)

Spring Boot 微服务 REST API 安全

如何在外部 tomcat 中部署 Spring-boot REST API