使用getter / setter

时间:2015-06-26 09:01:28

标签: java json abstract-class inner-classes

我有以下抽象类结构:

public abstract class A {
    ...
    private List<B> b;

    public List<B> getB() {
        return b;
    }
    public void setB(List<B> b) {
        this.b = b;
    }
    public static abstract class B {

    }
}

并像这样实现:

public class AA extends A {
    public static class BB extends B {
        ...
    }

当我现在使用jackson在AA上映射Json时,我收到一个错误,它无法创建A $ B的实例。我认为这是因为A中的getter / setter仍然引用B而不是BB,这会导致错误。有没有办法可以这样做,而不是将getter / setter放在子类中?

3 个答案:

答案 0 :(得分:2)

您可以添加类型捕获以确保b始终正确键入,如下所示:

body

然后

---------------------
IAIK Java TPM Tools
---------------------


16:34:56:631 [ERROR] TcTcsBindingSoap::connect (116):    There seems no TCS running
16:34:56:647 [ERROR] TcTcsBindingSoap::connect (116):    There seems no TCS running
iaik.tc.tss.api.exceptions.tsp.TcTspException:

TSS Error:
error layer:                0x3000 (TSP)
error code (without layer): 0x0103
error code (full):          0x3103a
error message: Core Service connection failed.

at iaik.tc.tss.impl.java.tsp.tcsbinding.soapservice.TcTcsBindingSoap.connect(TcTcsBindingSoap.java:117)
at iaik.tc.tss.impl.java.tsp.internal.TcTspInternal.TspContextConnect_Internal(TcTspInternal.java:368)
at iaik.tc.tss.impl.java.tsp.TcContext.connect(TcContext.java:174)
at iaik.tc.apps.jtt.tpm.TpmVersion.execute(TpmVersion.java:68)
at iaik.tc.utils.cmdline.SubCommand.run(SubCommand.java:69)
at iaik.tc.utils.cmdline.SubCommandParser.parse(SubCommandParser.java:41)
at iaik.tc.apps.JTpmTools.main(JTpmTools.java:224)

答案 1 :(得分:1)

如何反序列化有多种选择。如果你没有注释,杰克逊可能会回到使用最近的超类的构造函数,该构造函数具有没有参数的公共构造函数。创建一个空对象后,它会使用反射设置字段。

  • 反射将绕过self.typeCollectionView = nil; 等构造函数中的任何验证。

如何使用Jackson的更精确的方法是在构造函数中使用Objects.requireNotNull@JsonCreator,命名所有参数。

  • 这使您可以强制杰克逊使用您制作的构造函数并验证对象。

我对这个相当不寻常的结构非常不确定。毕竟,你有一个嵌套在抽象类中的抽象类,我看过很多东西,但我还没有看到过这样的东西。有充分的理由吗?或者将内部类移动到自己的文件不是问题吗? (毕竟它是@JsonProperty

答案 2 :(得分:0)

如果您创建AA的实例,则需要抽象类B的实例,并定义nowwhere,使用哪个实例。仅提供一些实现(BB)是不够的。