如何在 Quarkus 中调整 json 配置?

How do you adjust json config in Quarkus?

我正在尝试向 Jackson's ObjectMapper in a Quarkus 项目添加一个 mixin。我有一些代码看起来像这样:

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {

    private final ObjectMapper mapper;

    public ObjectMapperContextResolver() {
        this.mapper = createObjectMapper();
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return mapper;
    }

    private ObjectMapper createObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.addMixIn(MyModel.class, MyMixin.class);
        return mapper;
    }
}

此代码在我的 Thorntail 项目中完美运行。出于某种原因,Quarkus 没有选择它,并且对象映射器不受影响。我与 Quarkus CDI 有什么不同吗?

更新

显然我对实现有点困惑。我应该使用 Json-B api。我想出了如何更改 Json-B 的配置并将其发布在下面。

您可以提供 JsonbConfig 而不是提供 ObjectMapper,这样您就可以自定义 serialization/deserialization。

这是我最终使用的:

@Provider
public class JsonConfig implements ContextResolver<Jsonb> {

    @Override
    public Jsonb getContext(Class type) {
        JsonbConfig config = new JsonbConfig();
        config.withPropertyVisibilityStrategy(new IgnoreMethods());
        return JsonbBuilder.create(config);
    }
   }

  class IgnoreMethods implements PropertyVisibilityStrategy {

    @Override
    public boolean isVisible(Field field) {
        return true;
    }

    @Override
    public boolean isVisible(Method method) {
        return false;
    }
}

这允许您自定义 JsonbConfig。在这里,我的特别禁止访问 serialization/deserialization 的方法。在 Quarkus with Panache 上,这可以防止 isPersistent 出现在您的 JSON 输出中。

除了@jsolum 的正确答案之外,这里还有一个可用的提供程序,它使用 fasterxml-annotations 检查字段和方法的可见性:

@Provider
public class JsonConfig implements ContextResolver<Jsonb> {

    @Override
    public Jsonb getContext(Class aClass) {
        JsonbConfig config = new JsonbConfig();
        config.withPropertyVisibilityStrategy(new PropertyVisibilityStrategy() {
            @Override
            public boolean isVisible(Field field) {
                JsonIgnore annotation = field.getAnnotation(JsonIgnore.class);
                return annotation == null || !annotation.value();
            }

            @Override
            public boolean isVisible(Method method) {
                JsonIgnore annotation = method.getAnnotation(JsonIgnore.class);
                return annotation == null || !annotation.value();
            }
        });
        return JsonbBuilder.create(config);
    }
}
可以自定义 Quarkus 中的

JsonbConfig,提供 JsonbConfigCustomizerApplicationScoped 实例(考虑@jsolum 的回答):

@ApplicationScoped
public class JsonbFormattingConfig implements JsonbConfigCustomizer {

    @Override
    public void customize(JsonbConfig jsonbConfig) {
        jsonbConfig.withPropertyVisibilityStrategy(new IgnoreMethods());
    }
}

class IgnoreMethods implements PropertyVisibilityStrategy {
    @Override
    public boolean isVisible(Field field) {
        return true;
    }

    @Override
    public boolean isVisible(Method method) {
        return false;
    }
}

来源:https://quarkus.io/guides/rest-json#json-b