JAVA EE CDI 范围、EJB 和托管 Bean 序列化

2023-11-29

对作用域、ejb 和托管 bean 有一些疑问。

  1. 范围(javax.enterprise.context.ApplicationScope、javax.enterprise.context.SessionScope)是否仅适用于 EJB?或者它们适用于所有托管 Bean?直到今天我还很确定它适用于所有托管豆。
  2. 在我的应用程序中,我们有:

    @ApplicationScoped
    public class MyClass implements MyNonSerializableInterface {
      @Inject  
      private transient NonSerializableLogger transientLogger;
      @Inject
      private NonSerializableLogger logger;
     ...
    }
    

    和一些经理:

    @Singleton
    public class SomeManager {
        @Inject private MyClass myClass;  
    
    }
    

    和网络服务:

    @Path("some")
    public class SomeWebService {
        @Inject private SomeManager;
    
    }
    

容器(部署时间)或编译器不会抱怨它,这正常吗?

我以为:

“使用会话、应用程序或对话范围的 Bean 必须是可序列化的,但使用请求范围的 Bean 不必是可序列化的。”JAVA EE 使用范围

MyClass 是否应该实现 Serialized?我们是否可以说,因为托管 bean 被注入到 @Singleton 中,所以序列化永远不会发生?因此在部署时不会显示序列化错误?

  1. 如果是:如果我创建 MyClass @ApplicationScoped 和 @Stateful 并使用 @EJB 将其注入 SomeManager 中,那么在部署时我确实会收到有关序列化的错误。
  2. 如果否:为什么我没有得到瞬态记录器的一些 NullPointerExceptions(由于钝化/激活)?

CDI 范围是在 CDI 容器的上下文中评估的。也就是说,CDI 规范的设计者确保它可以与 EJB 和 jsf Managed Bean 一起使用。就是这样说的。

  1. 理想情况下,CDI 范围是使用上下文敏感的。 @ApplicationScoped 意味着 CDI bean 从创建实例到应用程序结束都有效。它由 CDI 容器管理,与 EJB bean 完全无关。但由于与 EJB 的互操作性,它可以被注入 (@Inject) 到 EJB @Singleton bean 中。 EJB 规范和 CDI 规范都没有要求 @Singleton bean 或 @ApplicationScope bean 可序列化。由于这是一个应用程序范围的实例,因此不需要钝化。

  2. @SessionScope 使用当前容器希望的任何会话语义。例如,在 jsf 应用程序中,它的作用域通常为 HttpSession 的生命周期,但在没有 HttpSession 的 EJB 容器中,容器不会附加任何有意义的会话语义。它可能决定成为每个 @Stateless 事务或任何它希望的事务。由于会话可以序列化,因此规范通常要求 @SessionScoped beans 可序列化,但定义注入点的 bean(如果不是 @SessionScoped)则不需要可序列化。

  3. @RequestScope 还遵循“原子”操作的单次执行的语义,例如http请求。在Web容器中,它通常与HttpRequest相关联,并且不要求它是可序列化的。在非 Web 上下文中,它可以与每次调用相关联,甚至可以与事务边界相关联(在注入 EJB 的情况下),或者当无法归属有意义的作用域时,它将在注入点默认为 @Dependent 作用域。

也就是说,任何 CDI bean 都可以注入到任何 EJB bean 中。通常,在不与 Web 容器关联的 EJB 容器中,@Dependent 和 @ApplicationScope 是唯一具有任何有意义用途的作用域。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA EE CDI 范围、EJB 和托管 Bean 序列化 的相关文章

  • C++ 相当于 Python getattr

    在Python中 有一个名为getattr的函数 它看起来像这样 class MyObject def init self self xyz 4 obj MyObject getattr obj xyz 其中对 getattr 的调用将返回
  • 创建自定义 json 转换器来屏蔽敏感信息

    我正在编写一个自定义 json 转换器 它将序列化一个对象并屏蔽包含一些敏感信息的某些字段 我已经创建了转换器 但是当我使用转换器序列化对象时 我得到一个空字符串 有人可以告诉我我做错了什么吗 public class Student pu
  • ASP.NET Web 服务中的 XML 文档中存在非法字符

    我要问并回答我自己的问题 我希望没人介意 但我认为这可能对其他人有用 如果您设置的 ASP NET Web 服务返回的对象包含对 XML 无效的字符 则在将对象序列化为 SOAP xml 并且客户端尝试反序列化该 xml 后 将会引发异常
  • GSON:如何在保持循环引用的同时防止 StackOverflowError?

    我有一个带有循环引用的结构 出于调试目的 我想转储它 基本上任何格式都可以 但我选择了JSON 由于它可以是任何类 所以我选择了不需要 JAXB 注释的 GSON 但是 GSON 会遇到循环引用并递归直到StackOverflowError
  • AngularJS:如何在 AngularJS 中使用或注入第三方库

    我是 Angular 和 Deployd 的新手 想知道如何一起使用它们 我发现 Deployd 网站中的示例很好 但它只消耗其余 API 数据 我想了解如何将 Deployd 作为 AngularJS 中的服务 例如 通过部署中可用的收集
  • Django Rest Framework:如何为 PUT 和 PATCH 等更新操作设置字段为必填/只读?

    我有一个 Django 序列化器 它有一个字段 该字段仅适用于 PUT 和 PATCH 等更新操作 但不适用于 POST 等创建操作 我发现这个类似的SOquestion https stackoverflow com q 30953481
  • 为 Json 对象生成的 C# 类的优点和缺点

    我有示例 Json 我需要将其序列化为 C 对象 我决定为此目的利用杠杆Json Net http json codeplex com 图书馆 我还需要有 C 类来表示这个 Json 可以使用创建类Json C 类生成器 http json
  • NestJs:如何使 Body 输入形状与实体的 DTO 不同?

    我的照片和标签对象有 DTO 如下所示 export class PhotoDto readonly title string readonly file string readonly tags TagDto export class T
  • 使用 Hibernate 映射数组

    你能帮我使用 Hibernate 映射这个类吗 public class MyClass private Long id private String name private int values 我使用的是 PostgreSQL 表中的
  • JBoss 中的 jndi.properties

    有没有办法配置 JNDI 以便查找首先检查 localhost 如果没有找到匹配的名称 则会自动发现其他 jndi 服务器 我对文档的理解是 这是使用集群时的默认行为 16 2 2 客户端配置 http docs jboss org jbo
  • 树结构的序列化/反序列化

    我试图找出保存 序列化 并稍后打开 反序列化 树结构的最佳方法 我的结构由具有不同属性的各种对象类型组成 但每个对象类型都继承自基本抽象 Node 类 每个节点都有唯一的 ID GUID 并且有一个 AddSuperNode Node nd
  • PHP:__toString() 和 json_encode() 不能很好地协同工作

    我遇到了一个奇怪的问题 我不知道如何解决它 我有几个类 它们都是 JSON 对象的 PHP 实现 这是问题的说明 class A protected a public function construct this gt a array n
  • Android - 具有可序列化对象的 SharedPreferences

    我知道 SharedPreferences 有putString putFloat putLong putInt and putBoolean 但我需要存储一个类型的对象Serializable in SharedPreferences 我
  • 在 AngularJS 中覆盖运行时的依赖关系

    我有一个服务叫 doggedHttp 它公开了与 http 现在我想创建一个 doggedResource服务是有角度的 resource服务之上 doggedHttp代替 http 换句话说我想注入 doggedHttp as the h
  • Symfony 4.1 组件 - 依赖注入问题

    我正在用 PHP 重构旧应用程序 我正在尝试使用 Symfony 依赖注入组件将服务注入控制器 或其他服务 但我不知道如何实现这一点 因为 symphony 文档比框架组件更适合使用框架 我已经有了自己的内核 包含所有服务和控制器的容器 控
  • 在简单注入器中注册具有多个构造函数和字符串依赖项的类型

    我正在尝试弄清楚如何使用 Simple Injector 我在项目中使用了它 注册简单服务及其组件没有任何问题 但是 当组件具有两个以上实现接口的构造函数时 我想使用依赖注入器 public DAL IDAL private Logger
  • 如何使用 Spring Resource.groovy 正确注入 Grails 服务

    使用 Grails 2 2 1 我定义了以下 Grails 服务 package poc class TestService def helperService class HelperService 我已经用过TestService如下
  • 哪里可以下载 JSTL jar [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道 因为我尝试过的所有地方似乎都超时了 您可以下载JSTL 1 1here http archiv
  • 如何读取 C# 字符串字典并将其写入文件?

    我有一个 Dictionary 对象 我想写入磁盘并能够从磁盘读取它 理想情况下 我会避免使用任何第三方库 有没有一种简单的方法可以使用常规 C 4 来做到这一点 答案已接受 Summary 选项 1 使用 JavaScriptSerial
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines

随机推荐

  • 使用 CUSPARSE 时遇到问题

    当我想编译我的程序 使用 Cusparse 时 出现了以下几行 tmp tmpxft 00001048 00000000 13 matvec o 在函数中main tmpxft 00001048 00000000 1 matvec cuda
  • 如何在 Fortran 中抑制“已删除功能:暂停语句”的警告?

    我用谷歌搜索但找不到答案 我怎样才能抑制这个警告 并且只有这个 警告 删除的功能 1 处的 PAUSE 语句 我知道我可以抑制所有警告 但我只想抑制这一警告 或者如果不可能的话 抑制删除功能的警告 谢谢 A 使用 std legacy 或
  • 运行 Nuget 还原时出现 NU1202 错误

    我有一个 NET Framework 解决方案 正在尝试使用 Azure DevOps 上的管道进行设置 我在尝试恢复包时遇到错误 NU1202 Package AppCenter Analytics Metrics 1 1 0 is no
  • 如何在 Matplotlib 中选择 Y 轴上每个点之间的大小?

    我只是想使用 x 轴列表和 y 轴列表制作一个普通图表 但问题是 我希望能够选择 y 轴的大小 就像点之间的长度一样 我希望自己能够选择 例如 我的 y 轴叙述 0 2 5 5 7 5 等 我想将其更改为0 2 4 6 8 等 那么有没有办
  • Sql Server 2005 上的报告服务 2008

    我可以将 Reporting Services 2008 与 SQL Server 2005 数据库一起使用吗 我是否需要两个许可证 适用于 SQL Server 2008 和 SQL Server 2005 我是否需要两个实例 SQL S
  • 在java中编写哈希函数的最佳实践是什么?

    我想知道在 java 中编写 hashCode 方法的最佳实践是什么 可以找到很好的描述here 有那么好吗 这是引用自有效的Java第二版 第 9 项 始终覆盖hashCode当你覆盖equals 虽然本项中的配方产生了相当好的散列函数
  • Android通过firebase推送Notification(服务器端)

    我正在尝试使用 firebase 云消息传递系统从服务器向我的 Android 设备发送推送通知 我能够成功注册我的设备 并且也为我的设备生成了令牌 我无法使用以下脚本向我的设备发送通知
  • 使用 new 分配内存返回相同的内存地址

    class abc int x int main abc A new abc cout lt lt static cast
  • 当没有剩余内存时,.Net 和 Bitmap 不会被 GC 自动处理

    我想知道 NET 中为位图分配的内存的分配和处置是如何工作的 当我在函数中的循环中创建大量位图并连续调用它时 它将一直工作 直到某个时候位图无法分配内存 给出指定大小的 无效参数 异常 如果我在垃圾收集器工作时调用垃圾收集器 使用以下代码
  • 如何解码 BLE 广告数据

    扫描 BLE 设备后 我调用以下方法 void centralManager CBCentralManager central didDiscoverPeripheral CBPeripheral peripheral advertisem
  • 将两个日期之间的所有日期作为颤振日期范围选择器中的列表返回

    我只从 flutter date range picker 中得到两个日期 但我想要两个选定日期之间的日期列表 感谢您的回答 尝试以下操作 List
  • 如何使用同一应用程序查找附近的 iOS 设备(GPS 位置)

    我想创建一个应用程序 允许用户使用登录到同一应用程序的 GPS 坐标查找附近其他用户的位置 它还可以跟踪正在移动的设备 登录到同一应用程序 的位置在车里 有人能给我概述一下如何实现这一目标吗 有没有免费的 API 可以用来完成这个任务 Da
  • 如何将 png 与 alpha/透明度实时加入帧中

    我正在 OpenCV android 2 4 11 的示例下工作 它使用相机检测面部 我没有在找到的脸上画一个矩形 而是尝试在脸上放置一个遮罩 png 图像 但为了在脸上显示图像 png 图像带有黑色背景 其中有透明度 FdActivity
  • “CL.exe”退出,代码为-1073741515

    我使用的是 Windows 7 64 位机器 我下载了 VC 的 Express 版本和 Windows SDK 我需要在 64 位编译器中编译我的代码 编译时 我收到以下错误 CL exe 退出 代码为 1073741515 这个错误是什
  • 键盘覆盖了我视图底部的文本字段

    我已经搜索过 here 仅当键盘覆盖输入字段时向上移动视图 here 当键盘快速出现时移动文本字段 here 当键盘存在时如何使 UITextField 向上移动 和这里 https developer apple com library
  • Zend_Auth 最佳实践

    我的目标是要求某些页面登录 我正在使用 Zend Framework MVC 并且我正在尝试查找有关最佳实践的示例 关于我正在寻找的内容的一些注释 我希望未登录的用户获得登录框 然后在经过身份验证后返回到页面的登录版本 我想使用依赖注入 并
  • 如何将 LPCSTR 字符串转换为 LPCTSTR 字符串?

    我正在尝试转换LPCSTR串入LPCTSTR细绳 我想连接两个字符串 当我尝试这样时 LPCTSTR str1 L Raja LPCSTR str2 Kumar wcscat s str1 LPCTSTR str2 我发现像 Raja 这样
  • Matlab imshow 无法正确绘图,但 imshowpair 可以正确绘图

    我已经导入了图像 我已将其解析为双精度并对其进行了一些过滤 当我绘制结果时imshow 双像太暗 但是当我使用imshowpair绘制原始图像和最终图像 两个图像都正确显示 我尝试过使用uint8 im2uint8 乘以 255 然后使用这
  • 按位置从 data.table 中提取列作为向量

    如何按位置从 data table 中提取列作为向量 以下是我尝试过的一些代码片段 DT lt data table x c 1 2 y c 3 4 z c 5 6 DT x y z 1 1 3 5 2 2 4 6 我想使用列位置获得此输出
  • JAVA EE CDI 范围、EJB 和托管 Bean 序列化

    对作用域 ejb 和托管 bean 有一些疑问 范围 javax enterprise context ApplicationScope javax enterprise context SessionScope 是否仅适用于 EJB 或者