我想启用某些类型为String的字段的自定义 jackson 解串器。解串器还需要注入(inject)基于guice的依赖项bean。下面的SampleCode:

public class CustomDeserializer extends StdDeserializer<String> {

    private SomeDependecy dependency;

    public StringDeserializer() {
        this(null);
    }

    public StringDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        return dependency.perform(p.getValueAsString());
    }
}

我无法基于Class类型注册模块,因为它是通用的(String.class,Complex Datatype(但并非每个模块都需要自定义反序列化器))。有没有一种方法可以在不使用静态方法的情况下实现上述目标?

PS:我确实进行了网络搜索,但是如果不使用static便找不到更干净的解决方案。使用一些静态方法获取上下文和bean的所有建议。

最佳答案

看一看ContextualDeserializer接口(interface)。从文档中:



假设您具有简单的解密接口(interface)和实现结构。

interface Dependency {

    String decrypt(String value);
}

class SomeDependency implements Dependency {

    public SomeDependency() {
        System.out.println("Create new SomeDependency!");
    }

    @Override
    public String decrypt(String value) {
        return value.replace('a', 'A');
    }
}

class DecryptModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(Dependency.class).to(SomeDependency.class);
    }
}

您的自定义解串器可能如下所示:
class DecryptDeserializer extends StdDeserializer<String> implements ContextualDeserializer {

    private Dependency dependency;

    public DecryptDeserializer() {
        super(String.class);
    }

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return dependency.decrypt(p.getValueAsString());
    }

    @Override
    public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) {
        Injector injector = Guice.createInjector(new DecryptModule());
        DecryptDeserializer deserializer = new DecryptDeserializer();
        deserializer.dependency = injector.getInstance(Dependency.class);

        return deserializer;
    }
}
createContextual方法用于创建新的反序列化器实例。您有许多如何创建它的选择。您甚至可以将此解决方案与Static Injection混合使用。

09-05 10:39