带有 Spring Data 的 Spring Boot Maven 多模块项目

Posted

技术标签:

【中文标题】带有 Spring Data 的 Spring Boot Maven 多模块项目【英文标题】:Spring boot maven multi module project with Spring Data 【发布时间】:2017-05-31 23:20:20 【问题描述】:

我有一个以 mysql 作为后端的 spring boot(1.4.3.RELEASE) 应用程序。将 Spring Data 与 Oracle UCP 和 MySQL Java 连接一起用于连接池。现在,尝试将其移至多模块项目。因此我的项目结构如下。

parent project
|---pom.xml  -> This is a parent pom.
|---common
    |---pom.xml
    |---src
|---model
    |---pom.xml
    |---src
|---service(Interface only)
    |---pom.xml
    |---src
|---service Impl(Implementations only)
    |---pom.xml
    |---src
|---repository(Spring Data)
    |---pom.xml
    |---src
|---web
    |---pom.xml
    |---src

我的父pom.xml如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/maven-v4_0_0.xsd">

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.3.RELEASE</version>
        <relativePath />
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test</groupId>
    <artifactId>test-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0-SNAPSHOT</version>
    <name>Test Project</name>
    <description>Test components</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>      
        <version.spring.boot>1.4.3.RELEASE</version.spring.boot>
        <version.mysql.connector>6.0.5</version.mysql.connector>
        <version.slf4j>1.7.21</version.slf4j>

    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- Spring -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <version>$version.spring.boot</version>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>$version.slf4j</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <modules>
    <module>cc-model</module>
    <module>cc-common</module>
    <module>cc-dbrepo</module>
    <module>cc-dbservice</module>
    <module>cc-dbserviceimpl</module>
    <module>cc-web</module>
</modules>

</project>

Web 中的Application.java:

@SpringBootApplication(scanBasePackages = 
             "com.test.dbrepo.service.impl", "com.test.db.service", "com.test.dbrepo.repository" )
public class DialerApplication 

web pom.xml:

<dependencies>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

       <dependency>
        <groupId>com.cc.dialer</groupId>
        <artifactId>cc-dbservice</artifactId>
        <version>$project.version</version>
    </dependency>

在我的存储库 pom.xml 中,我有 spring-data

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

我的数据源代码和存储库在存储库项目中。 我在 Web 模块中有我的 Spring 安全代码,它通过注入使用服务模块。

当我启动我的网络模块应用程序时出现以下错误。

创建名为“webSecurityConfig”的 bean 时出错:不满意 通过字段“userDetailsS​​ervice”表示的依赖关系;嵌套的 例外是 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为“userDetailsS​​ervice”的 bean 时出错:不满意 通过字段“userService”表示的依赖关系;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 'com.cc.test.db.service.UserService' 类型的合格 bean 可用:预计至少有 1 个符合 autowire 条件的 bean 候选人。依赖注解: @org.springframework.beans.factory.annotation.Autowired(required=true)

是否缺少其他配置。

启动时未发现服务实现模块中的 Bean。

谢谢

【问题讨论】:

您显示的 POM 不完整,因此我们无法在这里为您提供帮助。您缺少 SQL 数据源,您的驱动程序在哪里声明?在WAR运行中嵌入tomcat?还是spring-boot可执行jar中包含的jar?你的 mysql 驱动在 maven 中声明在哪里? 更新了我的帖子。 我会删除我的答案。我认为有一个误解,是由错误消息中的 "unsatisfied dependency" 字样引起的。可能您的 maven POM 是正确的,但是您的 Spring bean 定义存在问题。您应该在定义 Spring bean (Annotations ???) 的位置发布代码的基本部分。 用户服务在哪里?它包含在maven中吗?如果是,是否被spring正确扫描(自动扫描包)? 你好。我有完全相同的问题。最终解决您的问题的方法是什么? 【参考方案1】:

com.cc.test.db.service 根据你的配置没有扫描包。

添加它。

您的注释应如下所示:

@SpringBootApplication(scanBasePackages = 
             "com.test.dbrepo.service.impl", "com.test.db.service", "com.test.dbrepo.repository", "com.cc.test.db.service" )

【讨论】:

我也试过了。你它不工作。看到我在这里得到的错误是Caused by: java.lang.NoClassDefFoundError: Failed to link org/imsx/core/repository/UserRepository (Module "deployment.imsx.ear.webx.war" from Service Module Loader): org/springframework/data/jpa/repository/JpaRepository。如果主应用程序在父包中,通常spring boot不需要componentscan。

以上是关于带有 Spring Data 的 Spring Boot Maven 多模块项目的主要内容,如果未能解决你的问题,请参考以下文章

带有分页的 Spring Data 和 Native Query

带有 Spring Boot 的 Spring Data JPA 中的多个数据源,[重复]

带有嵌套字段和映射的 Spring Data 弹性搜索

在 Spring Boot + Spring Data Rest 中反序列化时忽略带有 @JsonProperty 的字段

使用带有 @Embeddable 类的 Spring Data 审计注释

带有 Spring Data JPA 的 Spring Boot 为 Oracle 数据库上的 findOne(...) 提供了无效字符问题