如何在 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
,提供 JsonbConfigCustomizer
的 ApplicationScoped
实例(考虑@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;
}
}
我正在尝试向 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);
}
}
JsonbConfig
,提供 JsonbConfigCustomizer
的 ApplicationScoped
实例(考虑@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;
}
}