1

我有一个带有created by字段的实体,我需要使用AuthenticatedUserService我创建的填充该字段。我需要在实体中注入此服务,以便我可以为该created by字段生成值。

这是我的认证用户服务

@Singleton
public class AuthenticatedUserService {

@Inject
private SecurityService securityService;

public String getUserIdentifier() {
    var authentication = securityService.getAuthentication();

    return String.valueOf(authentication.get().getAttributes().get("identifier"));
}

我尝试使用@Transient. 但这会为 AuthenticatedUserService 的实例返回 NullPointerException。实体看起来像这样。

@Entity(name = "car")
public class Car {
...
private String createdBy;

@Transient
@Inject
AuthenticatedUserService authenticatedUserService;

...  

 @PrePersist
 public void prePersist() {
    this.createdBy = authenticatedUserService.getUserIdentifier();
 }
}

有没有办法可以在 Micronaut 不管理的类中使用 AuthenticatedUserService?

我希望在 Micronaut中做这样的事情

4

1 回答 1

2

所以,我找到了一种方法来做到这一点。我们需要 的实例ApplicationContext来做到这一点

public class ApplicationEntryPoint {

public static ApplicationContext context;

public static void main(String[] args) {
    context = Micronaut.run();
 }
}

然后我创建了一个从ApplicationContext

public class BeanUtil{
 public static <T> T getBean(Class<T> beanClass) {
    return EntryPoint.context.getBean(beanClass);
 }
}

最后,使用BeanUtil.

@Entity(name = "car")
public class Car {
...
private String createdBy;

...  

 @PrePersist
 public void prePersist() {
 var authenticatedUserService = BeanUtil.getBean(AuthenticatedUserService.class);
  this.createdBy = authenticatedUserService.getUserIdentifier();
 }
}
于 2020-04-17T02:39:40.933 回答