我正在尝试在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的配置并将其发布在下面。
答案 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)
JsonbConfig
,提供 ApplicationScoped
的 JsonbConfigCustomizer
实例(考虑 @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;
}
}