- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 RestEasy 3.0.2,它是第一个 JAX-RS 2 实现之一,并在 Tomcat 7 中运行我的应用程序。我还通过 WELD 在我的应用程序中使用注入(inject),WELD 通过其 CDI 适配器与 RestEasy 集成.到目前为止一切正常。
现在,我编写了一个 ContainerRequestFilter 的实现,以在传入请求到达资源之前对其进行身份验证。 JAX-RS 标准规定,每个资源和每个其他使用 @Provider 注释进行注释的 JAX-RS 组件都可以进行注入(inject)。
这是我的过滤器实现的简化版本:
@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {
@Inject
AuthenticationProvider authenticationProvider;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
authenticationProvider.authenticate(requestContext);
}
}
注意:AuthenticationProvider 是 @RequestScoped。
通常,此解决方案有效。正在注入(inject)组件并按预期处理请求。
但我仍然怀疑过滤器的作用范围。如果它是应用程序范围的,那么这显然会导致确定性测试无法发现的“有趣”并发问题。
我查看了各种文档、指南和示例,但我没有发现任何使用过滤器注入(inject)或说明过滤器范围的内容。
最佳答案
对于 RestEasy,答案在 RestEasy documentation concerning CDI integration 中给出。 :
A CDI bean that does not explicitly define a scope is @Dependent scoped by default. This pseudo scope means that the bean adapts to the lifecycle of the bean it is injected into. Normal scopes (request, session, application) are more suitable for JAX-RS components as they designate component's lifecycle boundaries explicitly. Therefore, the resteasy-cdi module alters the default scoping in the following way:
If a JAX-RS root resource does not define a scope explicitly, it is bound to the Request scope.
If a JAX-RS Provider or javax.ws.rs.Application subclass does not define a scope explicitly, it is bound to the Application scope.
因此,使用@Provider 注释的 JAX-RS 过滤器是@ApplicationScoped。
该文档还指出,JAX-RS 提供程序可以通过向其添加适当的注释来与任何范围相关联。所以一般来说,JAX-RS 过滤器的范围是可以定制的。
重要的是要注意将@RequestScoped 对象注入(inject)@ApplicationScoped 过滤器是安全的。这是因为 CDI 不注入(inject)对实际对象的引用,而是对代理的引用。在代理上调用方法时,将在幕后为每个请求使用一个单独的对象实例。
这里是根据WELD documentation :
4.9. Client proxies
Clients of an injected bean do not usually hold a direct reference to a bean instance, unless the bean is a dependent object (scope @Dependent).
Imagine that a bean bound to the application scope held a direct reference to a bean bound to the request scope. The application-scoped bean is shared between many different requests. However, each request should see a different instance of the request scoped bean—the current one!
...
Therefore, unless a bean has the default scope @Dependent, the container must indirect all injected references to the bean through a proxy object. This client proxy is responsible for ensuring that the bean instance that receives a method invocation is the instance that is associated with the current context. The client proxy also allows beans bound to contexts such as the session context to be serialized to disk without recursively serializing other injected beans.
我使用以下代码来验证这一点(假设 entityManager 在示例中生成为 @RequestScoped):
@Provider
public class OtherTestFilter implements ContainerRequestFilter {
@Inject
EntityManager entityManager;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
Session session = (Session) entityManager.getDelegate();
System.out.println(session.hashCode());
}
}
这为过滤器处理的每个请求提供了不同的session 哈希值。所以理论和实践在这里是一致的。
关于jakarta-ee - JAX-RS 2 过滤器有哪些范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17897187/
我想了解为什么一些 Jakarta EE 规范是空的。 例如 Jakarta Annotations规范由免责声明和快速描述(3 行)组成,但是有 Javadoc . 当 JCP 负责 J2EE 规范
我正在研究 OpenNTF 项目“XPages Jakarta EE Support”。 我正在尝试为 Person 对象上的 CRUD 操作设置 REST API。我设法创建 GET 和 POST
我正在研究 OpenNTF 项目“XPages Jakarta EE Support”。 我正在尝试为 Person 对象上的 CRUD 操作设置 REST API。我设法创建 GET 和 POST
我正在采用 Jakarta EE 9 并使用 EJB 和 WEB 模块开发一个 EE 应用程序。 EJB 已经完成并部署在 Glassfish 6(Jakarta EE 9 的 RI 实现)上。现在,
OpenLiberty(v20.0.0.2-beta 或其他版本)中是否有办法将 jakarta ee 9(通过 webProfile-9.0 或 jakartaee-9.0 或任何仅 jakarta
在使用Spring Boot 3.0.7并试图保持更新时,我遇到了这个错误,不知道它是什么意思。。加载的依赖项是Spring Security 6.0.9,问题存在于使用Java 17或19的情况下(
有没有办法在 JPA 实体监听器中检查当前事务是否已提交,如下所示? @ApplicationScoped public class EntityListener { @Inject
以下代码使用 javamail api 通过 gmail smtp 服务器发送邮件和附件。 public void doSendGmail(){ from = txtFrom.getT
大家好我有一个应用程序(spring+hibernate)需要同时发送数千封电子邮件我被告知这里最好的解决方案是有一个邮件服务器我不知道从哪里开始,或者是否有更好的框架或服务所以请大家给我一些信息,从
我正在尝试从 Java 邮件的文件夹中删除/删除消息(在我将其复制到另一个文件夹之后),这是我的代码: Flags deleted = new Flags("DELETED"); folder.se
某些页面可以接收称为“P1”的特定请求参数: page.do?P1=value1 现在,一个scriptlet正在测试request参数的存在,如果P1为“value1”,则会在页面上呈现一些信息。
我有一段非常类似于此http://java.sun.com/developer/onlineTraining/JavaMail/contents.html#JavaMailFetching的代码 我的
我在NetBeans中创建了一个Java Web应用程序项目,并在其中创建了一个启动bean: package malibu.util; import javax.annotation.PostCon
我有两个不同的项目:A 和 B。 B 包含一个拦截器,我想在项目 A 以及将来的项目 C 和 D 中使用它。 我在两个项目中都使用 jboss-javaee-6.0 版本 3.0.3.Final(这意
我一直在阅读 “Java 事务” ,我一直困惑它是什么?什么是有用的? 最佳答案 你可以谷歌搜索并找到这样的页面:http://www.java-tips.org/java-ee-tips/enter
这个问题在这里已经有了答案: What exactly is Java EE? (5 个回答) Difference between an application server and a servl
Web 应用程序的用户界面通常包含用于执行 CRUD 操作的各种按钮。在执行以下操作时,按钮标签的建议命名约定是什么? 用户创建(添加用户...或添加用户或添加用户) 事件创建(添加事件...或添加事
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我对java网页环境很陌生。最近尝试用Java开发一个电子商务平台。 因此,我使用 j_security_check 基于表单作为我的身份验证工具。身份验证完成后,成功重定向到所需页面。 但是,由于我
什么时候 我通过无状态服务从数据库中获取实体, 然后在另一个 bean 和 中修改它 然后想通过无状态服务将其保存到数据库中, 我注意到实体已分离。我认为因为无状态服务的持久化上下文,实体从被夺取到存
我是一名优秀的程序员,十分优秀!