当前位置: 首页 > 面试题库 >

如何覆盖特定类的JsonSerializer的isEmpty方法而不覆盖序列化方法?

岳朝
2023-03-14
问题内容

我想为 isEmpty 方法添加自定义行为。

当我从 JsonSerializer<MySpecificClass>

我应该重写序列化方法,因为它是抽象的。

我想按原样保留序列化方法,并仅覆盖isEmpty方法。


问题答案:

为了修改isEmpty行为但保持默认的序列化,您可以利用 serializer修饰符
。您仍然必须实现自定义序列化程序,但是可以非常干净地利用默认序列化程序。

使用默认的序列化器创建一个自定义序列化器

defaultSerializer变量插入到您的自定义序列化器类中。当我们实现修饰符时,您将看到此序列化器的来源。在此类中,您将重写该isEmpty方法以完成所需的操作。在下面,如果MySpecificClass为空id,则Jackson认为它为空。

public class MySpecificClassSerializer extends JsonSerializer<MySpecificClass> {
    private final JsonSerializer<Object> defaultSerializer;

    public MySpecificClassSerializer(JsonSerializer<Object> defaultSerializer) {
        this.defaultSerializer = checkNotNull(defaultSerializer);
    }

    @Override
    public void serialize(MySpecificClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        defaultSerializer.serialize(value, gen, serializers);
    }

    @Override
    public boolean isEmpty(SerializerProvider provider, MySpecificClass value) {
        return value.id == null;
    }
}

创建一个自定义 BeanSerializerModifier

扩展BeanSerializerModifier和覆盖modifySerializer方法。在此方法内,您可以筛选要操作的类类型,并相应地返回自定义序列化程序。

public class MyClassSerializerModifier extends BeanSerializerModifier {
    @Override
    public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
        if (beanDesc.getBeanClass() == MySpecificClass.class) {
            return new MySpecificClassSerializer((JsonSerializer<Object>) serializer);
        }
        return serializer;
    }
}

将修饰符注册到 ObjectMapper

注册修饰符将允许您的序列化器在modifySerializer满足条件的任何时候触发。

ObjectMapper om = new ObjectMapper()
        .registerModule(new SimpleModule()
                .setSerializerModifier(new MyClassSerializerModifier()));


 类似资料:
  • 我想为isEmpty方法添加自定义行为。 当我从< code>JsonSerializer扩展时 我应该重写序列化方法,因为它是抽象的。 我想让序列化方法保持原样,只覆盖is空方法。

  • 问题内容: 我需要一些有关ajax的liferay方面的帮助。现在,我正在从页面调用ajax方法来提交一些数据。 这是我正在使用的示例代码: 在我的课程中,有一种方法被此ajax调用所调用: 所以我的问题是,现在它只是通过任何ajax类的默认方法进行校准。但是如何在ajax调用中调用类的特定方法? 我是ajax的新蜜蜂。所以无论如何请引导我..... 使用以下网址调用ajax时出现以下错误 我的流

  • 我在我的项目中使用lombok,并在POJO类上使用和注释生成和。我试图重写属性的setters方法,但它不起作用 我想检查JSON属性是空的还是空的,我想在Setter方法中设置默认值 工作场景: 失败的场景: 输出: 我也将此作为参考,但到目前为止运气不佳

  • 问题内容: 我使用的龙目岛在我的项目和产生和使用,并注解POJO类的顶部。我正在尝试覆盖属性的setter方法,但是它不起作用 我想检查JSON属性是否为空或空,我想在Setter方法中设置默认值 工作方案: 失败的情况: 输出: 问题答案: 您只是遇到了一个我从未见过的错误,或者您正在测试错误。 像这样的注释 在现场一级确实阻止了设置器的生成。但是考虑到要定义一个setter,您甚至不需要它。显

  • 我有一个抽象类,割草机,它覆盖了toString()方法。草坪拖拉机类扩展了割草机。它覆盖了toString()方法,并调用super.toString()作为方法的第一行。然后我有一个商业类,它扩展了劳恩拖拉机并覆盖了toString(),也在第一行调用super.toString()。当实例化一个商业对象(声明为割草机对象)并调用它的toString()时,我希望它打印割草机和草坪拖拉机的两个

  • 问题内容: 我正在尝试为参数化的类重写方法。 我如何确保该对象与相同? 问题答案: 您可以通过保留对类型的引用来实现。但是,我认为, 相等性测试应该针对对象表示的值,而不是针对这些值表示的具体类型 。 一个典型的例子是Collections API。 返回。尽管它们具有完全不同的类型,但是它们表示相同的值,即“空集合”。 就个人而言,代表一个相同数据(例如)的两个s是否应该不相等,因为一个是类型,