当使用scala case类时,Flink不允许POJO对象使用不可变的样式设置器

时间:2019-10-11 19:35:54

标签: scala apache-flink

相关问题:https://issues.apache.org/jira/browse/FLINK-14380

在使用类型提取器确定类是否符合POJO时,Flink将检查该类是否实现了setter和getter方法。对于setter方法,Flink声明返回类型为Sub Button8_Click() Sheets("DB - Ref Current").Range("Ref_Current").Copy Sheets("DB - Ref Monthly").Range("Ref_" & Range("MonthSelector").Value).PasteSpecial xlPasteAll Application.CutCopyMode = False Application.ScreenUpdating = True End Sub 。如果使用案例类,因为案例类设置器的返回类型经常是对象类的副本,则这是一个问题。考虑以下案例类:

Void

尽管提供了getter(生成的)和setter方法,但由于setter的返回类型不是空的,因此该类将被识别为无效的POJO。

此问题不鼓励不变性,并且在不退回Kryo序列化程序的情况下无法使用案例类。

问题位于第1806行的https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java中。这是该行的永久链接

https://github.com/apache/flink/blob/80b27a150026b7b5cb707bd9fa3e17f565bb8112/flink-core/src/main/java/org/apache/flink/api/java/typeutils/TypeExtractor.java#L1806

if支票的副本在这里

case class  SomeClass(x: Int) {
    x_=(newX: Int): SomeClass = { this.copy(x = newX) }
}

我相信

if((methodNameLow.equals("set"+fieldNameLow) || methodNameLow.equals(fieldNameLow+"_$eq")) &&
                    m.getParameterTypes().length == 1 && // one parameter of the field's type
                    (m.getGenericParameterTypes()[0].equals( fieldType ) || (fieldTypeWrapper != null && m.getParameterTypes()[0].equals( fieldTypeWrapper )) || (fieldTypeGeneric != null && m.getGenericParameterTypes()[0].equals(fieldTypeGeneric) ) )&&
                    // return type is void.
                    m.getReturnType().equals(Void.TYPE)
                ) {
                    hasSetter = true;
                }
            }

应修改为

m.getReturnType().equals(Void.TYPE)

这将允许案例类设置器返回对象的副本,从而启用用例类。这使我们能够保持不变,而不会被迫退回到Kryo串行器。

我很好奇此更改将如何与序列化程序和反序列化程序交互。我认为串行器/反序列化器可能以无法实现的方式使用setter方法。如果是这种情况,有什么方法可以在Flink中将Scala案例类用于POJO样式对象?

1 个答案:

答案 0 :(得分:0)

此问题已在https://issues.apache.org/jira/browse/FLINK-14380中修复,应该在Flink 1.10中可用