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模块:
@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);