@CreatedBy и @LastModifiedBy устанавливают фактическую сущность вместо идентификатора - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть объект, который выглядит следующим образом:

@Audited
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

  public static final long UNSAVED = 0;

  @Id
  @GeneratedValue
  private long id;

  @CreatedDate
  @Column(name = "created_at", updatable = false)
  private ZonedDateTime createdAt;

  @CreatedBy
  @OneToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "created_by")
  private User createdBy;

  @LastModifiedDate
  private ZonedDateTime updatedAt;

  @OneToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "updated_by")
  @LastModifiedBy
  private User updatedBy;

}

Я хочу @LastModifiedBy и @CreatedBy, чтобы они устанавливали соответствующих пользователей.Однако, когда я пытаюсь сохранить объект, я получаю исключение:

java.lang.ClassCastException: Cannot cast java.lang.Long to com.intranet.users.Users

Так что мне кажется, что он пытается установить не фактического пользователя, а его идентификатор.Есть ли способ сделать пружину действительным пользователем для объекта, а не только для его идентификатора?

Спасибо

1 Ответ

0 голосов
/ 07 декабря 2018

На это, похоже, довольно прямо отвечает документация :

В случае, если вы используете либо @CreatedBy, либо @LastModifiedBy, инфраструктуре аудита каким-то образом необходимо знать отекущий руководитель.Для этого мы предоставляем интерфейс SPI AuditorAware, который необходимо реализовать, чтобы сообщить инфраструктуре, кто является текущим пользователем или системой, взаимодействующей с приложением.Универсальный тип T определяет, каким типом должны быть свойства, аннотированные @CreatedBy или @LastModifiedBy.

В следующем примере показана реализация интерфейса, использующего объект аутентификации Spring Security:

Пример 104Реализация AuditorAware на основе Spring Security

class SpringSecurityAuditorAware implements AuditorAware<User> {

  public Optional<User> getCurrentAuditor() {

    return Optional.ofNullable(SecurityContextHolder.getContext())
        .map(SecurityContext::getAuthentication)
        .filter(Authentication::isAuthenticated)
        .map(Authentication::getPrincipal)
        .map(User.class::cast);   
  } 
} 

Реализация обращается к объекту аутентификации, предоставленному Spring Security, и ищет пользовательский экземпляр UserDetails, который вы создали в своей реализации UserDetailsService.Здесь мы предполагаем, что вы открываете пользователя домена с помощью реализации UserDetails, но, основываясь на найденной аутентификации, вы также можете найти его из любого места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...