假设我有一个想要序列化的对象:
class ToSerialize {
@JsonSerialize(using = ThingSerializer.class)
public Thing thing;
}
哪里
public class ThingSerializer extends StdSerializer<Thing> {
protected ThingSerializer() {
super(Thing.class);
}
@Override
public void serialize(Thing thing, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
// Some implementation
}
}
如何将内容注入到
ThingSerializer
中,而不必诉诸静态访问 CDI.current()
?比如:
@ApplicationScoped
public class ThingSerializer extends StdSerializer<Thing> {
@Inject
SomeService someService;
protected ThingSerializer() {
super(Thing.class);
}
@Override
public void serialize(Thing thing, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
// Some implementation
}
}
不幸的是,这似乎不起作用。
我知道我可以使用
ObjectMapperCustomizer
全局添加一个新的 ThingSerializer
,我可以向其传递我需要的任何依赖项。然而,我真的想避免在全局注册这个 ThingSerializer
,因为默认的序列化机制在 99% 的情况下都很好。
我也知道我可以将 CDI beans 作为属性传递给
ObjectMapper
,我可以在我的 ThingSerializer
中访问它,但我希望有一种稍微更优雅的方法。有这样的办法吗?
通过 ObjectMapperCustomizer 注册序列化器并在注册过程中解决依赖关系。
import com.fasterxml.jackson.databind.ObjectMapper;
import io.quarkus.jackson.ObjectMapperCustomizer;
import jakarta.inject.Singleton;
@Singleton
public class RegisterCustomModuleCustomizer implements ObjectMapperCustomizer {
@Inject
SomeService someService;
public void customize(ObjectMapper mapper) {
var module = new SimpleModule();
module.addSerializer(Thing.class, new ThingSerializer(someService));
mapper.registerModule(module);
}
}