首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Hibernate启用程序中添加自定义修订时出错

在Hibernate启用程序中添加自定义修订时出错
EN

Stack Overflow用户
提问于 2020-12-12 23:28:44
回答 3查看 4.6K关注 0票数 1

当我添加自定义修订实体时,我开始收到错误:

代码语言:javascript
复制
2020-12-13 00:22:29.418 ERROR 80983 --- [ost-startStop-1] o.s.b.web.embedded.tomcat.TomcatStarter  : Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'webSecurityConfig': Unsatisfied dependency expressed through field 'userDetailsService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userDetailsServiceImpl': Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Cannot create inner bean '(inner bean)#4384acd' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#4384acd': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/hibernate/resource/beans/spi/ManagedBeanRegistry

MyRevision:

代码语言:javascript
复制
package ...;

import org.hibernate.envers.DefaultRevisionEntity;
import org.hibernate.envers.RevisionEntity;

import javax.persistence.Entity;

@Entity
@RevisionEntity(MyRevisionListener.class)
public class MyRevision extends DefaultRevisionEntity {

    private String username;

    public String getUsername() { return username; }

    public void setUsername(String username) { this.username = username; }
}

MyRevisionListener:

代码语言:javascript
复制
package ...;

// import de.xxxxx.carorderprocess.models.User;
import org.hibernate.envers.RevisionListener;
// import org.springframework.security.core.Authentication;
// import org.springframework.security.core.context.SecurityContext;
// import org.springframework.security.core.context.SecurityContextHolder;

// import java.util.Optional;

public class MyRevisionListener implements RevisionListener {

    @Override
    public void newRevision(Object revisionEntity) {

        /* String currentUser = Optional.ofNullable(SecurityContextHolder.getContext())
                .map(SecurityContext::getAuthentication)
                .filter(Authentication::isAuthenticated)
                .map(Authentication::getPrincipal)
                .map(User.class::cast)
                .map(User::getUsername)
                .orElse("Unknown-User"); */

        MyRevision audit = (MyRevision) revisionEntity;
        audit.setUsername("dd");

    }
}

WebSecurityConfig:

代码语言:javascript
复制
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    UserDetailsServiceImpl userDetailsService;

UserDetailsServiceImpl:

代码语言:javascript
复制
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    UserRepository userRepository;

    @Override
    @Transactional
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new UsernameNotFoundException("User Not Found with username: " + username));

        return UserDetailsImpl.build(user);
    }

}

UserRepository:

代码语言:javascript
复制
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);

    Boolean existsByUsername(String username);
}

pom.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>de.xxxxxxx</groupId>
    <artifactId>carorderprocess</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>carorderprocess</name>
    <description>Demo project for Spring Boot</description>

    <dependencyManagement>
        <dependencies>

        </dependencies>
    </dependencyManagement>


    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

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


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.16</version>
            <scope>provided</scope>
        </dependency>


        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.5.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-envers</artifactId>
            <version>2.4.1</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-envers</artifactId>
            <version>5.4.25.Final</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <executions>
                    <execution>
                        <id>compile</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-15 23:15:23

我认为您的问题可能与您的pom.xml中的不同依赖关系有关。

首先,请删除spring-data-envers依赖项,除非您正在查询您不需要的审核表。即使在这种情况下,如果需要的话,您也可以使用Envers本身来获取该信息。

请注意,正如Sunit对答案的注释中所指出的,您需要删除属性repositoryFactoryBeanClass,它不能再取值EnversRevisionRepositoryFactoryBean。但是您可能仍然需要包含@EnableJpaRepositories注释。

虽然我最初表示您可以让Spring管理您的版本,但由于spring-boot-starter-parent的一个版本,框架提供了类似于5.2.17.Finalhibernate-xxx版本。

但是,正如您所指出的,您需要使用forRevisionsOfEntityWithChanges方法来查询您的审计实体。正如您在java文档中看到的那样,该方法是在AuditQueryCreator5.3版本中引入的。

因此,您需要提供以下依赖关系:

代码语言:javascript
复制
<dependency> 
  <groupId>org.hibernate</groupId> 
  <artifactId>hibernate-envers</artifactId> 
  <version>5.3.20.Final</version> 
</dependency>

但除此之外,您还需要提供hibernate-entitymanagerhibernate-core的兼容版本。

代码语言:javascript
复制
<dependency> 
  <groupId>org.hibernate</groupId> 
  <artifactId>hibernate-entitymanager</artifactId> 
  <version>5.3.20.Final</version> 
</dependency>

<dependency> 
  <groupId>org.hibernate</groupId> 
  <artifactId>hibernate-core</artifactId> 
  <version>5.3.20.Final</version> 
</dependency>
票数 2
EN

Stack Overflow用户

发布于 2020-12-16 03:52:11

根据我从以上所有评论中所了解到的,您的要求是

  • 使用Envers审核
  • ,并使用方法forRevisionsOfEntityWithChanges获取所有修改的列表,并在其中更改了

请从做这些开始

删除library.

  • Just annotation

  • All库hibernate-envers的依赖关系-- version 5.4.23.Final也为我工作过,

  • @EnableJpaRepositories存储库类中删除repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class应该只从JpaRespository扩展,而不是从RevisionRepository扩展。你不需要RevisionRepository

现在您应该能够启动并运行您的应用程序了。

现在回到问题上,如何使用forRevisionsOfEntityWithChanges方法获得所有修改。

  • 创建一个像这样的AuditConfiguration类,以创建AuditReader bean

@Configuration公共类AuditConfiguration {私有最终EntityManagerFactory entityManagerFactory;AuditConfiguration(EntityManagerFactory entityManagerFactory) { this.entityManagerFactory = entityManagerFactory;} @Bean AuditReader auditReader() {返回entityManagerFactory}

}

在您的类中添加

  • ,添加以下注释。没有这一点,该类的序列化就无法工作。e.g

@JsonIgnoreProperties({"hibernateLazyInitializer",“处理程序”})公共类AuditRevisionEntity扩展DefaultRevisionEntity {

实体类中的

  • 将选项withModifiedFlag = true添加到@Audited注释中。没有这一点,您就无法获得所有更改的实体修订。e.g

@Audited(withModifiedFlag = true)公共类客户{

  • 修改此实体审核表和字段*_mod的数据库表。例如,如果您有一个customer表,其中包含nameageaddress列,那么将列name_modage_modaddress_mod添加到customer_audit

F 253

最后,在服务方法中添加以下代码,以获得更改后的审计修订

@Autowired .forRevisionsOfEntityWithChanges(Customer.class,AuditReader auditReader;public List getRevisions(Long id) { AuditQuery auditQuery = auditReader.createQuery() auditReader.createQuery true) .add(AuditEntity.id().eq(id));返回auditQuery.getResultList();

}

我将在今天的某个时候尝试将相同的代码发布到Github中,这样您就可以查看工作代码了。

票数 2
EN

Stack Overflow用户

发布于 2020-12-13 13:56:29

你的代码看起来很好。但仅仅找出根本原因可能是不够的。

查看异常,很明显,应用程序失败了,因为它无法找到bean依赖项。

你能试着跟著

  1. 首先在build.gradle或pom.xml中检查您的库导入。通常,除了Spring数据JPA和Hibernate Envers

之外,您不应该需要任何其他Hibernate库。

  1. 尝试删除/禁用Hibernate Envers审计代码和库依赖项,并查看是否可以启动和运行应用程序。这将帮助您识别错误是由于Hibernate启动程序引起的,还是您的应用程序代码有其他问题。

如果以上所述无效,请提供更多信息。

什么版本的Spring您在class

  • Directory
  1. 上导入了哪些库(build.gradle或maven pom文件)
  2. 您在项目中有哪些其他配置--您是否有任何其他JPA配置文件或与Hibernate或JPA
  3. 相关的任何其他自定义配置?在Repository类的主应用程序
  4. 结构上有哪些注释,以及在哪个目录上进行组件扫描(如果您已经重写)

G 219

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65270930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档