当我添加自定义修订实体时,我开始收到错误:
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/ManagedBeanRegistryMyRevision:
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:
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:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsServiceImpl userDetailsService;UserDetailsServiceImpl:
@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:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
Boolean existsByUsername(String username);
}pom.xml:
<?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>发布于 2020-12-15 23:15:23
我认为您的问题可能与您的pom.xml中的不同依赖关系有关。
首先,请删除spring-data-envers依赖项,除非您正在查询您不需要的审核表。即使在这种情况下,如果需要的话,您也可以使用Envers本身来获取该信息。
请注意,正如Sunit对答案的注释中所指出的,您需要删除属性repositoryFactoryBeanClass,它不能再取值EnversRevisionRepositoryFactoryBean。但是您可能仍然需要包含@EnableJpaRepositories注释。
虽然我最初表示您可以让Spring管理您的版本,但由于spring-boot-starter-parent的一个版本,框架提供了类似于5.2.17.Final的hibernate-xxx版本。
但是,正如您所指出的,您需要使用forRevisionsOfEntityWithChanges方法来查询您的审计实体。正如您在java文档中看到的那样,该方法是在AuditQueryCreator中5.3版本中引入的。
因此,您需要提供以下依赖关系:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-envers</artifactId>
<version>5.3.20.Final</version>
</dependency>但除此之外,您还需要提供hibernate-entitymanager和hibernate-core的兼容版本。
<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>发布于 2020-12-16 03:52:11
根据我从以上所有评论中所了解到的,您的要求是
forRevisionsOfEntityWithChanges获取所有修改的列表,并在其中更改了请从做这些开始
删除library.
hibernate-envers的依赖关系-- version 5.4.23.Final也为我工作过,
@EnableJpaRepositories存储库类中删除repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class应该只从JpaRespository扩展,而不是从RevisionRepository扩展。你不需要RevisionRepository现在您应该能够启动并运行您的应用程序了。
现在回到问题上,如何使用forRevisionsOfEntityWithChanges方法获得所有修改。
AuditReader bean@Configuration公共类AuditConfiguration {私有最终EntityManagerFactory entityManagerFactory;AuditConfiguration(EntityManagerFactory entityManagerFactory) { this.entityManagerFactory = entityManagerFactory;} @Bean AuditReader auditReader() {返回entityManagerFactory}
}
在您的类中添加
@JsonIgnoreProperties({"hibernateLazyInitializer",“处理程序”})公共类AuditRevisionEntity扩展DefaultRevisionEntity {
实体类中的
withModifiedFlag = true添加到@Audited注释中。没有这一点,您就无法获得所有更改的实体修订。e.g@Audited(withModifiedFlag = true)公共类客户{
customer表,其中包含name、age、address列,那么将列name_mod、age_mod、address_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中,这样您就可以查看工作代码了。
发布于 2020-12-13 13:56:29
你的代码看起来很好。但仅仅找出根本原因可能是不够的。
查看异常,很明显,应用程序失败了,因为它无法找到bean依赖项。
你能试着跟著
之外,您不应该需要任何其他Hibernate库。
如果以上所述无效,请提供更多信息。
什么版本的Spring您在class
G 219
https://stackoverflow.com/questions/65270930
复制相似问题