Spring整合MongoDB Atlas时REST接口404问题求助
我在创建整合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

