未扫描的实体

Entities not scanned

我有一个代表单点登录 (SSO) 服务器数据层的 Maven 项目。其他客户端应用程序应依赖它进行用户身份验证和授权。

它是一个 .jar 存档,将被另一个 REST 项目使用,也是一个 Maven 项目。

两者都是 Spring 基于 Boot 2 的项目。

该项目应针对 H2 和 MySQL 数据库进行一些集成测试。

因为它是一个库,所以它本身并不 运行。但是它有一些要执行的集成测试。因此没有 main class.

用于构建和执行测试的命令是 mvn clean install -Denv="test"

我的源代码树如下所示:

├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── thalasoft
    │   │           └── userdata
    │   │               ├── config
    │   │               │   ├── DatabaseConfiguration.java
    │   │               │   ├── JpaService.java
    │   │               │   └── properties
    │   │               │       ├── AbstractDatabaseProperties.java
    │   │               │       ├── DatabaseH2TestProperties.java
    │   │               │       ├── DatabaseMySQLAcceptanceProperties.java
    │   │               │       ├── DatabaseMySQLPreProdProperties.java
    │   │               │       ├── DatabaseMySQLProdProperties.java
    │   │               │       ├── DatabaseMySQLTestProperties.java
    │   │               │       ├── DatabaseOraclePreProdProperties.java
    │   │               │       ├── DatabaseOracleProdProperties.java
    │   │               │       ├── DatabaseOracleTestProperties.java
    │   │               │       ├── DatabaseProperties.java
    │   │               │       └── PropertyNames.java
    │   │               ├── dialect
    │   │               │   ├── CustomMySQL5InnoDBDialect.java
    │   │               │   └── CustomOracle10gDialect.java
    │   │               ├── exception
    │   │               │   ├── CannotDeleteEntityException.java
    │   │               │   ├── EnrichableException.java
    │   │               │   ├── EntityAlreadyExistsException.java
    │   │               │   ├── EntityNotFoundException.java
    │   │               │   └── NoEntitiesFoundException.java
    │   │               ├── jpa
    │   │               │   ├── domain
    │   │               │   │   ├── AbstractEntity.java
    │   │               │   │   ├── EmailAddress.java
    │   │               │   │   ├── User.java
    │   │               │   │   └── UserRole.java
    │   │               │   └── repository
    │   │               │       ├── GenericRepositoryImpl.java
    │   │               │       ├── GenericRepository.java
    │   │               │       ├── UserRepositoryCustom.java
    │   │               │       ├── UserRepositoryImpl.java
    │   │               │       ├── UserRepository.java
    │   │               │       ├── UserRoleRepositoryCustom.java
    │   │               │       ├── UserRoleRepositoryImpl.java
    │   │               │       └── UserRoleRepository.java
    │   │               └── service
    │   │                   ├── UserRoleServiceImpl.java
    │   │                   ├── UserRoleService.java
    │   │                   ├── UserServiceImpl.java
    │   │                   └── UserService.java
    │   └── resources
    │       ├── application.properties
    │       └── custom
    │           └── typedef.hbm.xml
    └── test
        ├── java
        │   └── com
        │       └── thalasoft
        │           └── userdata
        │               ├── assertion
        │               │   └── UserAssert.java
        │               ├── it
        │               │   ├── jpa
        │               │   │   ├── AbstractRepositoryTest.java
        │               │   │   ├── UserRepositoryTest.java
        │               │   │   └── UserRoleRepositoryTest.java
        │               │   └── service
        │               │       ├── AbstractServiceTest.java
        │               │       └── UserServiceTest.java
        │               └── ut
        │                   ├── AbstractRepositoryTest.java
        │                   └── UserRepositoryTest.java
        └── resources
            ├── h2
            │   └── data-source-test.properties
            ├── mysql
            │   ├── clean-up-before-each-test.sql
            │   └── data-source-test.properties
            └── oracle
                ├── data-source-preprod.properties
                └── data-source-test.properties

由于另一个 Maven 工具箱项目中定义的自定义注释,DatabaseH2TestProperties 已加载:

@EnvTest
@DbH2
@Configuration
@PropertySource({ "classpath:h2/data-source-test.properties" })
public class DatabaseH2TestProperties extends AbstractDatabaseProperties {

  private static Logger logger = LoggerFactory.getLogger(DatabaseH2TestProperties.class);

  public DatabaseH2TestProperties() {
    logger.debug("===========>> Loading the classpath h2/data-source-test.properties file");
  }
}

data-source-test.properties 文件包含:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.datasource.driver-class-name=net.sf.log4jdbc.DriverSpy
spring.datasource.url=jdbc:log4jdbc:h2:file:./target/useraccounttest
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.show-sql=true

所有测试均基于class:

@ContextConfiguration(classes = { DatabaseConfiguration.class })
@RunWith(SpringRunner.class)
@Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts = { "classpath:mysql/clean-up-before-each-test.sql" })
public abstract class AbstractRepositoryTest {
}

关于这个class,不知是否应该用@SpringBootTest(classes = { DatabaseConfiguration.class })代替

配置完成:

@EnableAutoConfiguration
@ComponentScan(nameGenerator = PackageBeanNameGenerator.class, basePackages = { "com.thalasoft.userdata" })
public class DatabaseConfiguration {
}

H2数据库连接成功:

02:23:56.299 [main] DEBUG jdbc.audit - 100. Connection.getMetaData() returned dbMeta74: conn99: url=jdbc:h2:file:./target/useraccounttest user=SA  com.zaxxer.hikari.pool.ProxyConnection.getMetaData(ProxyConnection.java:361)
02:23:56.299 [main] DEBUG org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator - Database ->
       name : H2
    version : 1.4.197 (2018-03-18)
      major : 1
      minor : 4
02:23:56.299 [main] DEBUG org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator - Driver ->
       name : H2 JDBC Driver
    version : 1.4.197 (2018-03-18)
      major : 1
      minor : 4
02:23:56.299 [main] DEBUG org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator - JDBC version : 4.0
02:23:56.299 [main] INFO org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
02:23:56.305 [main] DEBUG jdbc.audit - 100. Connection.clearWarnings() returned   com.zaxxer.hikari.pool.ProxyConnection.close(ProxyConnection.java:250)

但是我得到了一个例外。

控制台日志必须说明的内容:

02:23:56.338 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
02:23:56.338 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'com.thalasoft.userdata.config.JpaService'
02:23:56.338 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'com.thalasoft.userdata.config.properties.DatabaseH2TestProperties'
02:23:56.338 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'com.thalasoft.userdata.jpa.repository.GenericRepositoryImpl'
02:23:56.338 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'com.thalasoft.userdata.jpa.repository.GenericRepositoryImpl'
02:23:56.338 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
02:23:56.340 [main] WARN org.springframework.context.support.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.thalasoft.userdata.jpa.repository.GenericRepositoryImpl' defined in file [/home/stephane/dev/java/projects/user-data/target/classes/com/thalasoft/userdata/jpa/repository/GenericRepositoryImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.Class<?>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

的确,我有一个自定义通用存储库:

@Repository
@Transactional
public class GenericRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID>
        implements GenericRepository<T, ID> {

    private EntityManager entityManager;

    private final Class<T> domainClass;

    public GenericRepositoryImpl(Class<T> domainClass, EntityManager entityManager) {
        super(domainClass, entityManager);
        this.entityManager = entityManager;
        this.domainClass = domainClass;
    }

    public EntityManager getEntityManager() {
        return entityManager;
    }
}

@NoRepositoryBean
public interface GenericRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {

  public EntityManager getEntityManager();
}

它被用作:

public interface UserRepository extends GenericRepository<User, Long>, UserRepositoryCustom {
}

public interface UserRepositoryCustom {

    public User deleteByUserId(Long id) throws EntityNotFoundException;

}

public class UserRepositoryImpl implements UserRepositoryCustom {

    @Autowired
    private UserRepository userRepository;

}

感觉泛型找不到域class

您的 GenericRepository 接口和 GenericRepositoryImpl class 符合 custom repository implementations in Spring Data JPA 中使用的存储库片段的模式,所以我的猜测是 Spring 数据正在尝试实例化它以供使用。我会尝试将 GenericRepositoryImpl 重命名为 AbstractGenericRepository 或将其设为抽象 class 或两者兼而有之。您也可以尝试删除 @Repository 注释 - 毕竟 class GenericRepositoryImpl 不是存储库,而是实现一个的基础。

编辑: 从您的代码看来,您似乎正在使用 GenericRepository 创建存储库,并使用自定义方法按 ID 删除用户。话虽如此,我相信这段代码就足够了:

public interface UserRepository extends JpaRepository<User, Long> {
    void deleteByUserId(Long id);
}

并且如果您的用户 class 中的字段 userId 是注释为实体 ID 的字段,您甚至不需要自定义方法,因为 JpaRepository 扩展了 CrudRepository,它已经具有方法 deleteById(ID id)。