【发布时间】:2020-12-20 14:37:39
【问题描述】:
我有一个类作为 RequestScope bean:
@RequestScope
class RequestContext {
private String requestId;
private String traceId;
private String authorisedId;
private String routeName;
// few more fields
@Inject RequestContext(SecurityContext securityContext) {
this.requestId = UUID.randomUUID().toString();
if(securityService.getAuthentication().isPresent()){
this.authorisedId = (securityService
.getAuthentication().get()).getUserId().toString();
}
}
/* to be updated in controller method interceptors */
public void updateRouteName(String name){
this.routeName = name;
}
这个想法是让一个包含 REST 请求级别自定义数据的对象可以跨应用程序访问,this 的范围显然应该在当前请求内。这可以用于说.. 日志记录 - 每当开发人员从应用程序记录任何内容时,一些请求元数据都会随之而来。
我不清楚 @RequestScope bean 到底是什么:
根据它的定义 - 我的假设是它是为每个新的 http 请求创建的,并且在该请求的生命周期内共享相同的实例。
Micronaut 什么时候建造的?它是不可变的吗?
在多个请求中,我可以看到相同的 requestId(每个请求都需要新的 UUID)
这是 @RequestScope bean 的正确用例吗?
【问题讨论】:
-
如果您的请求范围的 bean 被注入到 Singleton bean 中,这可能不起作用。在这种情况下,您需要使用 Provider
注入 bean -
@CyrilG。感谢您的回复。您能否进一步了解第一次创建请求范围 bean 的时间?尝试将 Provider
注入单例 bean,但失败并出现 NonUniqueBeanException :找到多个可能的 bean 候选者 - 他们究竟是在什么时候创建的? -
@CyrilG。不知道那是什么错误,似乎已经清除了。但是通过注入 Provider
提供程序,每次调用 provider.get() 时,它都会创建一个新的 RequestContext 实例,从而达到请求范围的目的 -
@CyrilG。你使用
Provider是对的。在这里找到github.com/micronaut-projects/micronaut-core/issues/1615 -
@Sreerag 我猜你
NonUniqueBeanException是因为已经有其他名为RequestContext的 bean,所以 micronaut 不知道要注入哪一个
标签: java micronaut requestcontext requestscope micronaut-rest