java 如何使用Lombok和Gson序列化抽象getter?

yftpprvb  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(120)

目标是强制重写getter,它在我序列化时返回一个常量。我在类方面寻找解决方案,而不是在序列化器上。

import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import com.google.gson.Gson;

    abstract class AbstractClass implements Serializable {
        @Setter
        @Getter
        private String abstractVariable;

        public abstract String getAbstractVariable();
    }

    @Data
    class ConcreteClass extends AbstractClass implements Serializable {
        private String concreteVariable;

        @Override
        public String getAbstractVariable() {
            return "Constant Value";
        }
    }

Gson gson = new Gson();
System.out.println("ConcreteClass="+gson.toJson(new ConcreteClass()));
=>
ConcreteClass={}

这个解决方案不起作用,我尝试了很多事情没有成功:@Getter(AccessLevel.NONE)@Expose(serialize = false)...

tvz2xvvm

tvz2xvvm1#

由于GSON使用反射来访问字段,而不是getter/setter,因此我的解决方案无法工作。我尝试使用Gson JsonSerializer和TypeAdapter,但它们的方法无法访问字段的父示例来调用getter(太糟糕了,它会很酷,并提供很多可能性)。
因此,为了强制设置 abstractVariable,我现在在抽象类中使用构造函数。因此,我不能在扩展类中使用@Data,必须用许多注解来替换它:

@Data
abstract class AbstractClass implements Serializable {

    public AbstractClass(String abstractVariable) {
        this.abstractVariable = abstractVariable;
    }

    private String abstractVariable;
}

@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@Getter
@Setter
class ConcreteClass extends AbstractClass {
    public ConcreteClass() {
        super("const");
    }

    private String concreteVariable;
}

Gson gson = new Gson();
System.out.println("ConcreteClass="+gson.toJson(new ConcreteClass()));
=>
ConcreteClass={"abstractVariable":"const"}

如果有人看到另一个解决方案,我很想知道它,特别是如果它更简单

相关问题