Quarkus中的对话范围



我正在将一个应用程序从Thorntail迁移到Quarkus。它使用bean中的conversation scope注释,该注释在所有rest api请求期间向任何感兴趣的服务提供令牌信息。但在Quarkus文档中,它表示没有实现conversation作用域。我可以使用类似的功能吗?

以下是我想做的:

@Path
@ApplicationScoped
public class FruitsResource {
@Inject FruitsService fruitsService;
@POST
public int post (Fruit fruit) {
return fruitsService.post(fruit);
}
}
@Provider
@ApplicationScoped
private class AuthorizationFilter implements ContainerRequestFilter {
@Inject AuthorizationHolder authorizationHolder;
@Override
public void filter (ContainerRequestContext request) {
String token = request.getHeaderString(HttpHeaders.AUTHORIZATION);
Authorization authorization = createAuthorizationFromToken(token);
authorizationHolder.setAuthorization(authorization);
}
}
@ConversationScoped
private class AuthorizationHolder {
private Authorization authorization;
@Produces
public Authorization getAuthorization () {
return authorization;
}
public void setAuthorization (Authorization authorization) {
this.authorization = authorization;
}
}
@ApplicationScoped
private class FruitsService {
@Inject Authorization authorization;
@Inject EntityManager entityManager;
@Transactional
public void post (Fruit fruit) {
// do some complex validation with the authorization object
...
// persist object
entityManager.persist(fruit);
entityManager.flush();
return fruit.getId();
}
}

每个请求中是否存在Authorization标头?我认为它是(或应该是(,在这种情况下,只使用@RequestScoped而不是@ConversationScoped应该有效。无论如何,这可能是最好的做法。

如果标头仅存在于"第一个"请求中,并且同一会话中的后续请求可以重用该令牌,那么您可以将@ConversationScoped替换为@SessionScoped。不过,我认为强制在所有请求中都显示标头会更好。

最后,如果你真的想模仿对话,你可以做这样的事情(没有经过测试,甚至没有在IDE中编写,只是在我的脑海中(:

@SessionScoped
private class AuthorizationHolder {
private ConcurrentMap<String, Authorization> authorizations = new ConcurrentHashMap<>();
public Authorization getAuthorization(ContainerRequestContext request) {
return authorizations.get(getConversationId(request));
}
public void setAuthorization(ContainerRequestContext request, Authorization authorization) {
this.authorizations.put(getConversationId(request), authorization);
}
private String getConversationId(ContainerRequestContext request) {
MultivaluedMap<String, String> query = request.getUriInfo().getQueryParameters();
return query.getFirst("cid");
}
}

然而,正如我在上面所说的,我真的认为应该使bean成为@RequestScoped,并强制客户端在每个请求中发送Authorization头。

最新更新