Spring Boot中配置 AuditListener

banq發表於2024-03-04

Spring Boot Data 提供支援透明地跟蹤誰建立了實體或更改了實體以及這些事情發生的時間。所有記錄均清晰儲存。例如,如果一位使用者進入該站點並登入該站點。然後這些時間會儲存在資料庫中,當使用者再次登入網站時,這些記錄也會儲存在資料庫中,我們可以說審計。

在本文中,我們將在 Spring Boot 應用程式中實現 AuditListener 的配置。

以下是在簡單的 Spring Boot 應用程式中配置AuditListener的步驟。

步驟1:首先,我們將建立一個使用者類。

import jakarta.persistence.*; 
import lombok.AllArgsConstructor; 
import lombok.Getter; 
import lombok.NoArgsConstructor; 
import lombok.Setter; 

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = <font>"user"
public class User { 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    private String name; 
    private String email; 



使用者類,用於維護使用者詳細資訊並將這些資料儲存到資料庫中。

第 2 步:現在實施服務類。

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 
import org.technous.batchprac2.dto.UserDTO; 
import org.technous.batchprac2.exception.ResourceNotFoundException; 
import org.technous.batchprac2.model.User; 
import org.technous.batchprac2.repository.UserRepository; 
import org.technous.batchprac2.service.UserService; 

import java.util.List; 

@Service
public class UserServiceIMPL implements UserService { 

    @Autowired
    private UserRepository userRepository; 
    public User userToDto(UserDTO userDTO){ 
        User user = new User(); 
        user.setFirstName(userDTO.getFirstName()); 
        user.setLastName(userDTO.getLastName()); 
        user.setEmailId(userDTO.getEmailId()); 
        return user; 
    } 
    public UserDTO dtoToUser(User user){ 
        UserDTO userDTO=new UserDTO(); 
        userDTO.setFirstName(user.getFirstName()); 
        userDTO.setLastName(user.getLastName()); 
        userDTO.setEmailId(user.getEmailId()); 
        return userDTO; 
    } 

    @Override
    public List<UserDTO> getAllUsers() { 
        List<User> user = userRepository.findAll(); 
        return null
    } 

    @Override
    public UserDTO getUserById(Long userId) throws ResourceNotFoundException { 
        User user = userRepository.findById(userId) 
                .orElseThrow((()->new ResourceNotFoundException(<font>"Employee not Found"))); 
        return dtoToUser(user); 
    } 

    @Override
    public UserDTO createUser(UserDTO userDTO) { 
        User ruser = userToDto(userDTO); 
        User rruser = userRepository.save(ruser); 
        return dtoToUser(rruser); 
    } 

    @Override
    public UserDTO updateUser(Long userId, UserDTO user) throws ResourceNotFoundException { 
        User useru = userRepository.findById(userId) 
                .orElseThrow(() -> new ResourceNotFoundException(
"User not found :: " + userId)); 

        useru.setEmailId(user.getEmailId()); 
        useru.setLastName(user.getLastName()); 
        useru.setFirstName(user.getFirstName()); 
        User updatedUser = userRepository.save(useru); 

        return dtoToUser(updatedUser); 
    } 

上面的程式碼是服務層的,我們在其中編寫所有業務邏輯以將使用者資料儲存到資料庫中。

第 3 步:現在我們將建立 Rest 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.http.ResponseEntity; 
import org.springframework.web.bind.annotation.*; 
import org.technous.batchprac2.dto.UserDTO; 
import org.technous.batchprac2.exception.ResourceNotFoundException; 
import org.technous.batchprac2.model.User; 
import org.technous.batchprac2.service.UserService; 
import java.util.List; 

@RestController
@RequestMapping(<font>"/api"
public class UserController { 

    @Autowired
    private UserService userService; 


    @GetMapping(
"/users"
    public List<UserDTO> getAllUsers() { 
        return userService.getAllUsers(); 
    } 

    @GetMapping(
"/users/{id}"
    public ResponseEntity<UserDTO> getUserById( 
            @PathVariable(value =
"id") Long userId) throws ResourceNotFoundException { 
        UserDTO user = userService.getUserById(userId); 
        return ResponseEntity.ok().body(user); 
    } 

    @PostMapping(
"/users"
    public UserDTO createUser(@RequestBody UserDTO userDTO) { 
        return userService.createUser(userDTO); 
    } 

    @PutMapping(
"/users/{id}"
    public ResponseEntity<UserDTO> updateUser( 
            @PathVariable(value =
"id") Long userId, 
            @RequestBody UserDTO userDetails) throws ResourceNotFoundException { 
        UserDTO user = userService.updateUser(userId,userDetails); 
        return ResponseEntity.ok(user); 
    } 


現在我們需要透過稽核來儲存使用者,這意味著我們在使用者更新時儲存資訊時跟蹤資訊,因此它們會自動更新系統的時間和資料。

第 4 步:現在,建立持續監視應用程式的 Auditable 類。


import jakarta.persistence.EntityListeners; 
import jakarta.persistence.MappedSuperclass; 
import jakarta.persistence.Temporal; 
import lombok.Getter; 
import lombok.Setter; 
import org.springframework.data.annotation.CreatedBy; 
import org.springframework.data.annotation.CreatedDate; 
import org.springframework.data.annotation.LastModifiedBy; 
import org.springframework.data.annotation.LastModifiedDate; 
import org.springframework.data.jpa.domain.support.AuditingEntityListener; 

import java.util.Date; 

import static jakarta.persistence.TemporalType.TIMESTAMP; 

@Setter
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class
public abstract class AudiTable<U> { 

    @CreatedBy
    protected U createdBy; 

    @CreatedDate
    @Temporal(TIMESTAMP) 
    protected Date createdDate; 

    @LastModifiedBy
    protected U lastModifiedBy; 

    @LastModifiedDate
    @Temporal(TIMESTAMP) 
    protected Date lastModifiedDate; 


當使用者進入系統時,Entitylistner會持續監控他們。

第5步:現在,實現AuditAware介面(內建介面)。


import java.util.Optional; 

import org.springframework.data.domain.AuditorAware; 

public class AuditorAwareImpl implements AuditorAware<String> { 
    @Override
    public Optional<String> getCurrentAuditor() { 
        return Optional.of(<font>"Geeksforgeek"); 
    } 

AuditorAware介面是內建介面,他們監視想要修改系統資料並儲存您提供的任何名稱的人

第6步:現在,設定Spring Boot主應用程式。

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.annotation.Bean; 
import org.springframework.data.domain.AuditorAware; 
import org.springframework.data.jpa.repository.config.EnableJpaAuditing; 
import org.technous.batchprac2.audit.AuditorAwareImpl; 

@EnableJpaAuditing(auditorAwareRef = <font>"auditorAware"
@SpringBootApplication
public class AditingExampleApplication { 

    @Bean
    public AuditorAware<String> auditorAware() { 
        return new AuditorAwareImpl(); 
    } 
    public static void main(String[] args) { 
        SpringApplication.run(Batchprac2Application.class, args); 
    } 


在主應用程式中,我們需要製作一個像上面這樣的bean。透過這個東西,所有稽核中的申請都會被儲存,更新也會被儲存。

現在,如果我們執行這個應用程式,呼叫Rest API,這個應用會自動根據我們的系統時間填寫createdBy、createdOn、updatedBy、updatedOn這個欄位:在MySQL資料庫中我們可以看到包含createdBy、createdOn、updatedBy和updatedOn。

如果任何使用者嘗試更新其資料,lastUpdatedTime 將發生變化。這樣我們就可以在這裡稽核任何內容。

 

相關文章