我正在将一个应用程序从Thorntail迁移到Quarkus。它在一个bean中使用会话范围注释,该bean在所有对它感兴趣的服务的rest api请求期间提供令牌信息。但是在Quarkus的文档中,它说对话范围没有实现。有没有类似的功能我可以使用?
下面是我想做的:
@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
就可以了。无论如何,这可能是最好的做法。
如果头仅存在于“first”请求中,并且同一会话中的后续请求可以重用该令牌,那么您可以将@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
头。
我曾尝试在Quarkus中添加logback,但后来意识到Quarkus不支持logback。如果我错了,我可以通过一个示例了解如何在Quarkus中配置logback。提前谢谢。
Quarkus 是一个用于编写 Java 应用的云原生、容器优先框架。 特性包括: 容器优先:最小的Java应用程序,最适合在容器中运行 云原生:在 Kubernetes 等环境中采用 12 要素原则。 统一命令式与反应式:在一个编程模型下带来非阻塞和命令式开发风格。 基于标准:Standards-based:基于一些标准和框架(RESTEasy、Hibernate、Netty、Eclipse V
当我使用 在返回Uni的函数中,它总是显示这个错误 使用惰性身份验证时,无法从IO线程调用getIdentity(),因为解析标识可能会阻塞线程。相反,您应该注入CurrentIdentityAssociation,调用CurrentIdentityAssociation # getDeferredIdentity()并订阅Uni。 有没有如何在Quarkus安息反应中使用JWT的例子? 如果我在
我是Quarkus的新手,我正在Quarkus 1.13.3中尝试OIDC,我添加了oidc-dependency并用@rolesalloved注释了我的REST-Service-methods。当我用过期的JWT-Token调用服务时,我得到401,当我用错误的用户组调用时,我得到403,到目前为止这还不错。但是,Quarkus在这样做的时候并没有在日志中写入任何内容。我需要日志消息声明有人用无
我正在尝试使用Quarkus构建一个小型REST服务。我正在使用Hibernate和PostgreSQL数据库。它在所有好的情况下都非常有效。但是当出现Hibernate异常时,比如,我无法以正常方式捕获它们。异常被包装为其他异常和。因此,可以通过使用 存储库 资源 由于这个问题,也无法为HibernateException添加一个。是否有人遇到过类似的问题,或者我的代码存在一般性问题?我正在使用
我只是在用Quarkus做实验,我在ResourceLoader上遇到了一个问题。具体来说,当我尝试使用ResourceLoader inject时,maven的干净安装出错了 这是maven的输出: 您知道如何在Quarkus中使用ResourceLoader吗,或者是否有一种等效的方法来读取类路径资源中的文件? 这是我目前的情况: 我已经在project resources文件夹中找到了这些文