Java 未在Jackson序列化程序内解析CDI注入

Java 未在Jackson序列化程序内解析CDI注入,java,jakarta-ee,jackson,cdi,Java,Jakarta Ee,Jackson,Cdi,我正在尝试将一个@RequestScoped对象类注入Jackson的JsonSerializer: 此对象类在项目的任何其他位置上解析。 我正在使用Wildfly 8 J2EE实现 编辑: 我有一个配置jackson mapper的主要资源: @ApplicationScoped public class SerializationApplicationResources { protected ObjectMapper mapper; @PostConstruct prote

我正在尝试将一个
@RequestScoped
对象类注入Jackson的
JsonSerializer

此对象类在项目的任何其他位置上解析。 我正在使用Wildfly 8 J2EE实现

编辑:

我有一个配置jackson mapper的主要资源:

@ApplicationScoped
public class SerializationApplicationResources
{

  protected ObjectMapper mapper;

  @PostConstruct
  protected void initialize_resources() throws IllegalStateException
  {
    this.mapper = new ObjectMapper();

    SimpleModule module = new SimpleModule();

    module.addDeserializer(DigitalInput.class, new DigitalInputDeserializer());
    module.addSerializer(DigitalInput.class, new DigitalInputSerializer());
为了使用它,我只使用
@Inject
注释我的字段,然后我有一个实例

@Inject protected SerializationApplicationResources jacksonResources;
那么

this.jacksonResources.getMapper().writeValueAsBytes(entity);
第一种可能性:

UserRequestResources
注入
SerializationApplicationResources
并通过构造函数将注入的实例传递给
DigitalInputSerializer

第二种可能性:


使
DigitalInputSerializer
也处于管理状态,例如
RequestScoped
(甚至是
无状态的
),将其注入
SerializationApplicationResources
,并使用注入的实例而不是显式创建对象-然后,传递注入的
UserRequestResources
也应该被启动。

可能没有简单的方法来实现这一点,因为正如其他人所指出的,Jackson序列化的对象不会自动注入,因为Jackson不知道这个过程将如何发生

但是Jackson确实有扩展点来构建简单的模块来实现这一点。例如,有GUI和OSGi模块:

两者都支持使用Jackson的
@JacksonInject
注释(指示注入的位置和使用的逻辑id),以使用任何机制模块想要的方式查找可注入对象。 所以,如果CDI注入模块不存在的话,应该可以实现CDI注入模块(我不知道有一个,但因为它应该是可行的,可能有人已经这样做了)


这假设您想要注入的对象是由Jackson基于JSON创建的;在这种情况下,CDI实现本身通常无权访问它。

因为
DigitalInputSerializer
不是由容器实例化的(它是由
new
操作符创建的),所以此类中的注入将不起作用


如果您需要快速修复解决方案,您可以通过编程方式获取
UserRequestResources
。请看这篇文章:

您的
DigitalInputSerializer
类的作用域是什么?我不明白为什么会这样,JsonSerializer不是服务器管理的资源,您可能没有手动将其转换为命名bean。如何获取
DigitalInputSerializer
类型的对象?如果您自己构造它们,请将
UserRequestResources
的注入实例传递给
DigitalInputSerializer
。如果没有,请将
DigitalInputSerializer
CDI设置为托管,并在使用它的类中插入
DigitalInputSerializer
。请参阅编辑的文章。我有一个主对象类。将请求范围的bean注入应用程序范围的bean不是一个好主意。
@Inject protected SerializationApplicationResources jacksonResources;
this.jacksonResources.getMapper().writeValueAsBytes(entity);