You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring整合MongoDB Atlas时REST接口404问题求助

整合MongoDB Atlas的REST Service出现404 Not Found异常

我在创建整合MongoDB Atlas的REST Service时,访问/te接口总是收到404 Not Found错误,Spring无法识别我的RestController。已确认MongoDB连接正常,但调整目录结构、配置ComponentScan都未解决问题。

项目目录结构

com.example.demo3
                 Demo3Application.java
                 CRUDEMongo.java
                |_test
                      CrudeController.java

代码片段

Demo3Application.java

package com.example.demo3;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.ServerApi;
import com.mongodb.ServerApiVersion;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.demo3", "com.example.demo3.test"})
public class Demo3Application{
    @Autowired
    Test test;
    public static void main(String[] args) {
        SpringApplication.run(Demo3Application.class, args);
        String connectionString = "mongodb+srv://torben:<password>@cluster0.orswsxw.mongodb.net/?retryWrites=true&w=majority";
        ServerApi serverApi = ServerApi.builder().version(ServerApiVersion.V1).build();
        MongoClientSettings settings = MongoClientSettings.builder().applyConnectionString(new ConnectionString(connectionString)).serverApi(serverApi).build();
        System.out.println("Hello");
        try(MongoClient client = MongoClients.create(settings)){
        }
    }

}

CRUDEMongo.java

package com.example.demo3;

import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import org.springframework.data.repository.CrudRepository;
@EnableMongoRepositories
public interface CRUDEMongo extends CrudRepository<Test, Test>{

}

CrudeController.java

package com.example.demo3.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@RestController
@RequestMapping("/")
public class CrudeController {
  @RequestMapping(value="/te", method= RequestMethod.GET)
  public String requestMethodName() {
    return "Hello";
  }
}

数据库连接确认信息

MongoClient with metadata {"driver": {"name": "mongo-java-driver|sync", "version": "4.9.1"}, "os": {"type": "Linux", "name": "Linux", "architecture": "amd64", "version": "5.15.0-78-generic"}, "platform": "Java/Eclipse Adoptium/17.0.7+7"} created with settings MongoClientSettings{readPreference=primary, writeConcern=WriteConcern{w=majority, wTimeout=null ms, journal=null}, retryWrites=true, retryReads=true, readConcern=ReadConcern{level=null}, credential=MongoCredential{mechanism=null, userName='torben', source='admin', password=<hidden>, mechanismProperties=<hidden>}, streamFactoryFactory=null, commandListeners=[], codecRegistry=ProvidersCodecRegistry{codecProviders=[ValueCodecProvider{}, BsonValueCodecProvider{}, DBRefCodecProvider{}, DBObjectCodecProvider{}, DocumentCodecProvider{}, CollectionCodecProvider{}, IterableCodecProvider{}, MapCodecProvider{}, GeoJsonCodecProvider{}, GridFSFileCodecProvider{}, Jsr310CodecProvider{}, JsonObjectCodecProvider{}, BsonCodecProvider{}, EnumCodecProvider{}, com.mongodb.client.model.mql.ExpressionCodecProvider@5cff6b74, com.mongodb.Jep395RecordCodecProvider@627ff1b8]}, loggerSettings=LoggerSettings{maxDocumentLength=1000}, clusterSettings={hosts=[127.0.0.1:27017], srvHost=cluster0.orswsxw.mongodb.net, srvServiceName=mongodb, mode=MULTIPLE, requiredClusterType=REPLICA_SET, requiredReplicaSetName='atlas-12upi3-shard-0', serverSelector='null', clusterListeners='[]', serverSelectionTimeout='30000 ms', localThreshold='30000 ms'}, socketSettings=SocketSettings{connectTimeoutMS=10000, readTimeoutMS=0, receiveBufferSize=0, sendBufferSize=0}, heartbeatSocketSettings=SocketSettings{connectTimeoutMS=10000, readTimeoutMS=10000, receiveBufferSize=0, sendBufferSize=0}, connectionPoolSettings=ConnectionPoolSettings{maxSize=100, minSize=0, maxWaitTimeMS=120000, maxConnectionLifeTimeMS=0, maxConnectionIdleTimeMS=0, maintenanceInitialDelayMS=0, maintenanceFrequencyMS=60000, connectionPoolListeners=[], maxConnecting=2}, serverSettings=ServerSettings{heartbeatFrequencyMS=10000, minHeartbeatFrequencyMS=500, serverListeners='[]', serverMonitorListeners='[]'}, sslSettings=SslSettings{enabled=true, invalidHostNameAllowed=false, context=null}, applicationName='null', compressorList=[], uuidRepresentation=UNSPECIFIED, serverApi=ServerApi{version=V1, deprecationErrors=null, strict=null}, autoEncryptionSettings=null, contextProvider=null}

问题排查与解决方案

1. 修复Controller注解冲突

CrudeController中同时标注了@Controller和@RestController,@RestController已经包含@Controller与@ResponseBody的功能,重复注解会导致Spring无法正确识别控制器。移除多余的@Controller:

package com.example.demo3.test;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/")
public class CrudeController {
  @RequestMapping(value="/te", method= RequestMethod.GET)
  public String requestMethodName() {
    return "Hello";
  }
}

2. 修正CRUDEMongo泛型参数

CrudRepository的泛型规则为<实体类, 主键类型>,当前代码中<Test, Test>不符合规范,需将第二个参数改为Test实体的主键类型(如String、Long):

package com.example.demo3;

import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import org.springframework.data.repository.CrudRepository;

@EnableMongoRepositories
public interface CRUDEMongo extends CrudRepository<Test, String>{ // 假设Test主键为String类型

}

3. 移除无效Autowired注入

Demo3Application中@Autowired Test test;无实际作用,若Test类未被Spring管理还会导致启动异常,直接删除该行。

4. 简化ComponentScan配置

@SpringBootApplication默认扫描主类所在包及其子包,主类位于com.example.demo3,Controller在子包com.example.demo3.test,无需手动配置@ComponentScan,删除该注解即可:

package com.example.demo3;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.ServerApi;
import com.mongodb.ServerApiVersion;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;

@SpringBootApplication
public class Demo3Application{
    public static void main(String[] args) {
        SpringApplication.run(Demo3Application.class, args);
        String connectionString = "mongodb+srv://torben:<password>@cluster0.orswsxw.mongodb.net/?retryWrites=true&w=majority";
        ServerApi serverApi = ServerApi.builder().version(ServerApiVersion.V1).build();
        MongoClientSettings settings = MongoClientSettings.builder().applyConnectionString(new ConnectionString(connectionString)).serverApi(serverApi).build();
        System.out.println("Hello");
        try(MongoClient client = MongoClients.create(settings)){
        }
    }

}

5. 完善Test实体类

确保com.example.demo3包下存在Test实体类,并添加MongoDB实体注解@Document:

package com.example.demo3;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "test")
public class Test {
    @Id
    private String id; // 主键字段
    // 其他业务字段、getter、setter方法
}

完成以上修改后,重启Spring Boot应用,再次访问http://localhost:8080/te即可正常返回"Hello"。


内容的提问来源于stack exchange,提问作者Hans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:05:07