有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javajackson的mixin类没有做到:bug还是我做错了什么?

这是杰克逊2.3.3。我最近了解了杰克逊的mixin annotations,我正在尝试将它应用到一个班级中。然而,到目前为止还没有成功。所讨论的类是一个静态类,可以转换为另一个类:

public static class Report
{
    // Some non relevant public static final fields, then:

    public final int totalRuns;
    public final int totalInvocations;
    public final int totalMatches;
    public final int totalMismatches;
    public final double matchShare;
    public final int reinvocations;
    public final int rematches;
    public final int remismatches;
    public final double reinvocationShare;
    public final long totalNanoTime;
    public final List<RuleReport> ruleReports;

    public Report(final int totalRuns, final int totalMatches,
        final int totalMismatches, final int rematches,
        final int remismatches, final long totalNanoTime,
        final List<RuleReport> ruleReports)
    {
        this.totalRuns = totalRuns;
        this.totalInvocations = totalMatches + totalMismatches;
        this.totalMatches = totalMatches;
        this.totalMismatches = totalMismatches;
        this.matchShare = (double) totalMatches / (double) totalInvocations;
        this.reinvocations = rematches + remismatches;
        this.rematches = rematches;
        this.remismatches = remismatches;
        this.reinvocationShare = (double) reinvocations
            / (double) totalInvocations;
        this.totalNanoTime = totalNanoTime;
        this.ruleReports = ruleReports;
    }
    // Other, non relevant methods
}

没有其他构造函数。因此,我写了我的mixin课程:

public abstract class ProfilingReportMixin
{
    @JsonProperty("runs")
    private int totalRuns;
    @JsonIgnore
    private int totalInvocations;
    @JsonProperty("matches")
    private int totalMatches;
    @JsonProperty("mismatches")
    private int totalMismatches;
    @JsonIgnore
    private double matchShare;
    @JsonIgnore
    private int reinvocations;
    @JsonProperty("rematches")
    private int rematches;
    @JsonProperty("remismatches")
    private int remismatches;
    @JsonIgnore
    private double reinvocationShare;
    @JsonIgnore
    private long totalNanoTime;
    @JsonProperty("ruleReports")
    private List<RuleReport> ruleReports;

    @JsonCreator
    protected ProfilingReportMixin(
        @JsonProperty("runs") final int totalRuns,
        @JsonProperty("matches") final int totalMatches,
        @JsonProperty("mismatches") final int totalMismatches,
        @JsonProperty("rematches") final int rematches,
        @JsonProperty("remismatches") final int remismatches,
        @JsonProperty("totalNanoTime") final int totalNanoTime,
        @JsonProperty("ruleReports") final List<RuleReport> ruleReports
    )
    {
    }
}

显然,由于没有“bean构造函数”,我决定走@JsonCreator的路

我创建Module,注册它,没问题。。。除了尝试反序列化示例JSON时失败:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class org.parboiled.parserunners.ProfilingParseRunner$Report]: can not instantiate from JSON object (need to add/enable type information?)
 at [Source: java.io.BufferedInputStream@b41b571; line: 2, column: 5]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1078)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:268)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:124)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2144)
    at com.github.parboiled1.grappa.assertions.mixins.ProfilingReportMixin.main(ProfilingReportMixin.java:70)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

我真的不明白;我确实用@JsonCreator注释了mixin类的构造函数,到目前为止,它一直对我“正常”反序列化有效(这是我第一次尝试mixin)

这是杰克逊的错误还是我做错了什么


编辑main

public static void main(final String... args)
    throws IOException
{
    final ObjectMapper mapper = new ObjectMapper()
        .configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true);
    mapper.registerModule(GrappaModule.INSTANCE);

    final Closer closer = Closer.create();
    final InputStream in;

    try {
        in = closer.register(ProfilingReportMixin.class.
            getResourceAsStream("/profilingReports/test.json"));
        if (in == null)
            throw new IOException("resource not found");
        final ProfilingParseRunner.Report report
            = mapper.readValue(in, ProfilingParseRunner.Report.class);
        mapper.writerWithDefaultPrettyPrinter()
            .writeValue(System.out, report);
    } finally {
        closer.close();
    }
}

以及{}:

public final class GrappaModule
    extends SimpleModule
{
    private static final Version VERSION = new Version(1, 0, 0,
        "beta.5-SNAPSHOT", "com.github.parboiled1", "grappa");

    public static final Module INSTANCE = new GrappaModule();

    private GrappaModule()
    {
        super("grappa", VERSION);
    }

    @Override
    public void setupModule(final SetupContext context)
    {
        context.setMixInAnnotations(ProfilingParseRunner.RuleReport.class,
            RuleReportMixin.class);
        context.setMixInAnnotations(ProfilingParseRunner.Report.class,
            ProfilingReportMixin.class);
    }
}

共 (1) 个答案

  1. # 1 楼答案

    确保mixin类上的ctor签名与目标类上的ctor签名匹配。目标类ctor的totalNanoTime为long,而mixin ctor的totalNanoTime为int

    ░░░░░░░░░▄░░░░░░░░░░░░░░▄░░░░
    ░░░░░░░░▌▒█░░░░░░░░░░░▄▀▒▌░░░
    ░░░░░░░░▌▒▒█░░░░░░░░▄▀▒▒▒▐░░░
    ░░░░░░░▐▄▀▒▒▀▀▀▀▄▄▄▀▒▒▒▒▒▐░░░
    ░░░░░▄▄▀▒░▒▒▒▒▒▒▒▒▒█▒▒▄█▒▐░░░
    ░░░▄▀▒▒▒░░░▒▒▒░░░▒▒▒▀██▀▒▌░░░ 
    ░░▐▒▒▒▄▄▒▒▒▒░░░▒▒▒▒▒▒▒▀▄▒▒▌░░
    ░░▌░░▌█▀▒▒▒▒▒▄▀█▄▒▒▒▒▒▒▒█▒▐░░
    ░▐░░░▒▒▒▒▒▒▒▒▌██▀▒▒░░░▒▒▒▀▄▌░
    ░▌░▒▄██▄▒▒▒▒▒▒▒▒▒░░░░░░▒▒▒▒▌░
    ▀▒▀▐▄█▄█▌▄░▀▒▒░░░░░░░░░░▒▒▒▐░
    ▐▒▒▐▀▐▀▒░▄▄▒▄▒▒▒▒▒▒░▒░▒░▒▒▒▒▌
    ▐▒▒▒▀▀▄▄▒▒▒▄▒▒▒▒▒▒▒▒░▒░▒░▒▒▐░
    ░▌▒▒▒▒▒▒▀▀▀▒▒▒▒▒▒░▒░▒░▒░▒▒▒▌░
    ░▐▒▒▒▒▒▒▒▒▒▒▒▒▒▒░▒░▒░▒▒▄▒▒▐░░
    ░░▀▄▒▒▒▒▒▒▒▒▒▒▒░▒░▒░▒▄▒▒▒▒▌░░
    ░░░░▀▄▒▒▒▒▒▒▒▒▒▒▄▄▄▀▒▒▒▒▄▀░░░
    ░░░░░░▀▄▄▄▄▄▄▀▀▀▒▒▒▒▒▄▄▀░░░░░
    ░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▀▀░░░░░░░░
    

    太令人惊讶了