【问题标题】:Spring boot does not add record to MongoDBSpring Boot 不向 MongoDB 添加记录
【发布时间】:2021-02-17 11:52:29
【问题描述】:

[MacOS 大苏尔] 我正在尝试使用 Spring、MongoDB 和 PostgreSQL 创建一个混合系统数据库。我没有为 PSQL 实现任何东西,但我已经为 MongoDB 做了一切完美的事情。问题是它没有向 MongoDB (v4.4) 添加任何记录。甚至没有添加 LiveEventDB。也许是因为 Spring 没有找到存储库文件的事实 我通过 brew services start mongodb-community 启动 MongoServer。 然后我在 Intellij 编辑器上运行项目,日志很好。一切,除了这个,我认为:

在 3 毫秒内完成 Spring Data 存储库扫描。找到 0 个 MongoDB 存储库接口。

虽然我已经创建了一个repository interface java文件。

结构是: 【项目包结构】:https://i.stack.imgur.com/SCT1a.png

----文件----

application.properties

server.port = 8080
spring.data.mongodb.database=LiveEventsDB
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017

DBRepository.java

@Repository
public interface DBRepository extends MongoRepository<LiveEvents, String> {
}

LiveEvents.java

@Document(collation = "LiveEvents")
public class LiveEvents {

    @Id
    private String rowID;

    @Indexed(direction = IndexDirection.ASCENDING)
    private Integer EID;
...

DBAdder.java

@Component
public class DBAdder implements CommandLineRunner {

//    private LiveEvents liveEvents;
    private DBDriver DBdriver;

    public DBAdder(DBDriver dbDriver) {
        this.DBdriver = dbDriver;
    }

    @Override
    public void run(String... args) throws Exception {
        LiveEvents liveEvents = new LiveEvents(
                1,
                new FormTemplates[]{FormTemplates.SLIDER_FORM, FormTemplates.COMMENT_BLOCK_FORM}
        );

        this.DBdriver.deleteAll();

        this.DBdriver.save(liveEvents);
    }
}

DBController.java

@RestController
@RequestMapping("/LiveEvents")
public class DBController {

    private DBDriver driver;

    public DBController(DBDriver driver) {
        this.driver = driver;
    }

    @GetMapping("/all")
    public List<LiveEvents> getAll(){
        List<LiveEvents> events = this.driver.findAll();
        return events;
    }
}

忘记添加了:

主应用

@SpringBootApplication
@EnableMongoRepositories(basePackages = {"uk.co.group35.app.events.controllers"}, mongoTemplateRef="DBDriver")
public class LiveFeedbackApplication {

    public static void main(String[] args) {
        SpringApplication.run(LiveFeedbackApplication.class, args);
    }

}

POM.XML

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

【问题讨论】:

  • 请与 sping-boot 依赖项共享您的 pom.xml 的 sn-p。
  • @SergVasylchak,现在发布在主要问题中。谢谢
  • , mongoTemplateRef="DBDriver" 将其从您的 @EnableMongoRepositories 中删除。我不完全确定,但是 MongoTemplate 和您的 MongoRepository 的 bean 命名可能存在冲突
  • @SergVasylchak,嗯...如果我将 DBDriver 类命名为 DBRepository 会更好吗?我这样做了,但什么也没发生
  • 目的是消除可能的碰撞,所以是的,应该没问题。如果没有发生任何事情,我们仍然会丢失未检测到存储库的原因。

标签: java spring mongodb spring-boot


【解决方案1】:
@EnableMongoRepositories(basePackages = {"uk.co.group35.app.events.controllers"}, mongoTemplateRef="DBDriver")
  1. mongoTemplateRef 是 org.springframework.data.mongodb.core.MongoTemplate 的 bean 名称,它可能与存储库的 bean 名称冲突。

  2. 如果您使用@EnableMongoRepositories#basePackages,请仔细检查和维护包结构。如果你@SpringBootApplication注解的类在包结构的根目录中,你可以省略basePackages

【讨论】:

    【解决方案2】:

    替换私有DBDriver DBdriver;在 Controller 中,DBAdder 到 @自动连线 私有最终 DBDriver DBdriver

    【讨论】:

    • 为什么?单个组件的构造函数被隐式标记为@Autowired
    • 你可以阅读官方如何spring.io/guides/gs/accessing-data-mongodb
    • @SergVasylchak 是的,您可以编写私有的最终 DBDriver DBdriver 而无需注释
    • 您的观点更多地是关于 Spring 中的依赖注入要点。 OP 和您的方法都将起作用。但是如果你写@Autowired private final Component component它完全没有任何意义,因为最终字段将只在构造函数中分配,而注释被放置在字段上并且没有lombok.RequiredArgsConstructor + lombok.copyableAnnotation+=Autowired in 完全没用配置。即便如此,对于单构造函数组件,它仍然是多余的。
    • @DanMyrza,您能具体说明需要更改的文件吗?我也忘了添加这个:@SpringBootApplication @EnableMongoRepositories(basePackages = {"uk.co.group35.app.events.controllers"}, mongoTemplateRef="DBDriver") public class LiveFeedbackApplication { public static void main(String[] args) { SpringApplication.run(LiveFeedbackApplication.class, args); } }
    猜你喜欢
    • 2017-01-06
    • 2020-06-30
    • 2019-07-06
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2021-04-02
    • 1970-01-01
    相关资源
    最近更新 更多