JsonSerializer 中的 CDI (Quarkus) 注入

问题描述 投票:0回答:1

假设我有一个想要序列化的对象:

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
中访问它,但我希望有一种稍微更优雅的方法。有这样的办法吗?

java jackson quarkus
1个回答
0
投票

通过 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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.