如何在Quarkus中调整json配置?

时间:2019-03-19 05:14:16

标签: quarkus

我正在尝试在quarkus项目中向jackson对象映射器添加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;
    }
}

这段代码在我的一个棘手项目中完美地工作了。出于某种原因,quarkus不会采用这种方法,并且对象映射器也不会受到影响。我与quarkus cdi有什么不同吗?

更新

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

3 个答案:

答案 0 :(得分:2)

可以提供JsonbConfiguration而不是提供ObjectMapper,以便自定义序列化/反序列化。

这是我最终使用的内容:

@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。在这里,我专门阻止访问序列化/反序列化方法。在使用Panache的quarkus上,这可以防止isPersistent出现在您的json输出中。

答案 1 :(得分:1)

除了@jsolum的正确答案之外,这是一个有效的提供程序,它使用fastxml-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);
    }
}

答案 2 :(得分:0)

可以自定义 Quarkus 中的

JsonbConfig,提供 ApplicationScopedJsonbConfigCustomizer 实例(考虑 @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