简体   繁体   English

java.lang.UnsupportedOperationException:在 bean 类中不能有循环引用,但获得了类 java.time.ZoneOffset 的循环引用

[英]java.lang.UnsupportedOperationException: Cannot have circular references in bean class but got the circular reference of class java.time.ZoneOffset

While executing the below command在执行以下命令时

StructType obs = Encoders.bean(Test.class).schema();

I am getting the below error我收到以下错误

java.lang.UnsupportedOperationException: Cannot have circular references in bean class, but got the circular reference of class class java.time.ZoneOffset

class Test has OffsetDateTime field, which is causing the error.类 Test 具有OffsetDateTime字段,这导致了错误。 If I remove this field the error also goes away.如果我删除此字段,错误也会消失。 Is there a way by which I can avoid this circular reference error and also use OffsetDateTime?有没有办法可以避免这种循环引用错误并使用 OffsetDateTime?

java.lang.UnsupportedOperationException: Cannot have circular references in bean class, but got the circular reference of class class java.time.ZoneOffset
    at org.apache.spark.sql.errors.QueryExecutionErrors$.cannotHaveCircularReferencesInBeanClassError(QueryExecutionErrors.scala:984)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.inferDataType(JavaTypeInference.scala:148)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.$anonfun$inferDataType$1(JavaTypeInference.scala:156)
    at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
    at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
    at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
    at scala.collection.TraversableLike.map(TraversableLike.scala:286)
    at scala.collection.TraversableLike.map$(TraversableLike.scala:279)
    at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:198)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.inferDataType(JavaTypeInference.scala:154)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.inferDataType(JavaTypeInference.scala:134)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.$anonfun$inferDataType$1(JavaTypeInference.scala:156)
    at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
    at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
    at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
    at scala.collection.TraversableLike.map(TraversableLike.scala:286)
    at scala.collection.TraversableLike.map$(TraversableLike.scala:279)
    at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:198)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.inferDataType(JavaTypeInference.scala:154)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.$anonfun$inferDataType$1(JavaTypeInference.scala:156)
    at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
    at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
    at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
    at scala.collection.TraversableLike.map(TraversableLike.scala:286)
    at scala.collection.TraversableLike.map$(TraversableLike.scala:279)
    at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:198)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.inferDataType(JavaTypeInference.scala:154)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.$anonfun$inferDataType$1(JavaTypeInference.scala:156)
    at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
    at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
    at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
    at scala.collection.TraversableLike.map(TraversableLike.scala:286)
    at scala.collection.TraversableLike.map$(TraversableLike.scala:279)
    at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:198)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.inferDataType(JavaTypeInference.scala:154)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.$anonfun$inferDataType$1(JavaTypeInference.scala:156)
    at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286)
    at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
    at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
    at scala.collection.TraversableLike.map(TraversableLike.scala:286)
    at scala.collection.TraversableLike.map$(TraversableLike.scala:279)
    at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:198)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.inferDataType(JavaTypeInference.scala:154)
    at org.apache.spark.sql.catalyst.JavaTypeInference$.inferDataType(JavaTypeInference.scala:70)
    at org.apache.spark.sql.catalyst.encoders.ExpressionEncoder$.javaBean(ExpressionEncoder.scala:66)
    at org.apache.spark.sql.Encoders$.bean(Encoders.scala:171)
    at org.apache.spark.sql.Encoders.bean(Encoders.scala)```

OffsetDateTime not supported by Encoders Encoders不支持OffsetDateTime

As per Encoder doc , supported type for bean fields are:根据Encoder doc ,bean 字段支持的类型是:

supported types for java bean field: - primitive types: boolean, int, double, etc. - boxed types: Boolean, Integer, Double, etc. - String - java.math.BigDecimal, java.math.BigInteger - time related: java.sql.Date, java.sql.Timestamp, java.time.LocalDate, java.time.Instant - collection types: array, java.util.List, and map - nested java bean. Java bean 字段支持的类型: - 原始类型:boolean、int、double 等 - 盒装类型:Boolean、Integer、Double 等 - 字符串 - java.math.BigDecimal、java.math.BigInteger - 时间相关:java .sql.Date、java.sql.Timestamp、java.time.LocalDate、java.time.Instant - 集合类型:数组、java.util.List 和 map - 嵌套 Java bean。

So it looks like it may not be possible to use OffsetDateTime as far as I can see.因此,据我所知,似乎无法使用OffsetDateTime ZoneOffset is part of OffsetDateTime field so call Encoders.bean might be generating code which keeps referring ZoneOffset in circular manner. ZoneOffsetOffsetDateTime字段的一部分,因此调用Encoders.bean可能会生成代码,该代码会以循环方式持续引用ZoneOffset

Use Instant使用Instant

You can convert a OffsetDateTime object to the more basic class, Instant .您可以将OffsetDateTime对象转换为更基本的类Instant

Instant instant = odt.toInstant() ;

And back again.又回来了。

ZoneOffset offset = ZoneOffset.ofHours( -8 ) ;
OffsetDateTime odt = instant.atOffset( offset ) ;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 不能在bean类中使用循环引用,而是获得类class org.apache.avro.Schema的循环引用 - Cannot have circular references in bean class, but got the circular reference of class class org.apache.avro.Schema Java 17 java.lang.reflect.InaccessibleObjectException:无法将字段设为私有最终 java.time.ZoneOffset - Java 17 java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.time.ZoneOffset 为什么 java.time.ZoneOffset 实例“向后”排序? - Why do java.time.ZoneOffset instances sort 'backwards'? java.lang.UnsupportedOperationException 与 ArrayList() - java.lang.UnsupportedOperationException with ArrayList() 获取“java.lang.UnsupportedOperationException:” - Getting “java.lang.UnsupportedOperationException:” java.lang.UnsupportedOperationException:null - java.lang.UnsupportedOperationException: null java.lang.UnsupportedOperationException:删除 - java.lang.UnsupportedOperationException: remove java.lang.UnsupportedOperationException: JsonObject - java.lang.UnsupportedOperationException: JsonObject 模拟java.nio.ByteBuffer类时的java.lang.UnsupportedOperationException - java.lang.UnsupportedOperationException when mocking java.nio.ByteBuffer class 选择忽略此运行时异常java.lang.UnsupportedOperationException - Have chosen to ignore this runtime exception java.lang.UnsupportedOperationException
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM