[ https://issues.apache.org/jira/browse/BEAM-13965?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17494161#comment-17494161 ]
Kenneth Knowles commented on BEAM-13965: ---------------------------------------- Is this easy to change? Will it have any implications for cross-language things? > Polymorphic types not supported in PipelineOptions > -------------------------------------------------- > > Key: BEAM-13965 > URL: https://issues.apache.org/jira/browse/BEAM-13965 > Project: Beam > Issue Type: Improvement > Components: sdk-java-core > Reporter: Moritz Mack > Priority: P2 > > I noticed that polymorphic types using @JsonTypeInfo and @JsonSubTypes are > currently not supported in pipeline options as deserialization fails lacking > necessary type information. One has to provide a de/serializer and handle > things manually. > Looks like the deserialization code path should just follow the serialization > path. > > {noformat} > diff --git > a/sdks/java/core/src/main/java/org/apache/beam/sdk/options/PipelineOptionsFactory.java > > b/sdks/java/core/src/main/java/org/apache/beam/sdk/options/PipelineOptionsFactory.java > --- > a/sdks/java/core/src/main/java/org/apache/beam/sdk/options/PipelineOptionsFactory.java > (revision 53f5a3c1756509b6fab75d3946a9f95247d02184) > +++ > b/sdks/java/core/src/main/java/org/apache/beam/sdk/options/PipelineOptionsFactory.java > (date 1645114275316) > @@ -1725,7 +1725,8 @@ > } > } > > - private static JsonDeserializer<Object> > computeDeserializerForMethod(Method method) { > + private static Optional<JsonDeserializer<Object>> > computeCustomDeserializerForMethod( > + Method method) { > try { > BeanProperty prop = createBeanProperty(method); > AnnotatedMember annotatedMethod = prop.getMember(); > @@ -1736,16 +1737,10 @@ > .getAnnotationIntrospector() > .findDeserializer(annotatedMethod); > > - JsonDeserializer<Object> jsonDeserializer = > + return Optional.fromNullable( > DESERIALIZATION_CONTEXT > .get() > - .deserializerInstance(annotatedMethod, maybeDeserializerClass); > - > - if (jsonDeserializer == null) { > - jsonDeserializer = > - > DESERIALIZATION_CONTEXT.get().findContextualValueDeserializer(prop.getType(), > prop); > - } > - return jsonDeserializer; > + .deserializerInstance(annotatedMethod, > maybeDeserializerClass)); > } catch (JsonMappingException e) { > throw new RuntimeException(e); > } > @@ -1771,11 +1766,12 @@ > * JsonDeserialize} the specified deserializer from the annotation is > returned, otherwise the > * default is returned. > */ > - private static JsonDeserializer<Object> getDeserializerForMethod(Method > method) { > + private static @Nullable JsonDeserializer<Object> > getCustomDeserializerForMethod(Method method) { > return CACHE > .get() > .deserializerCache > - .computeIfAbsent(method, > PipelineOptionsFactory::computeDeserializerForMethod); > + .computeIfAbsent(method, > PipelineOptionsFactory::computeCustomDeserializerForMethod) > + .orNull(); > } > > /** > @@ -1796,10 +1792,13 @@ > return null; > } > > + JsonDeserializer<Object> jsonDeserializer = > getCustomDeserializerForMethod(method); > + if (jsonDeserializer == null) { > + return DESERIALIZATION_CONTEXT.get().readTreeAsValue(node, > method.getReturnType()); > + } > + > JsonParser parser = new TreeTraversingParser(node, MAPPER); > parser.nextToken(); > - > - JsonDeserializer<Object> jsonDeserializer = > getDeserializerForMethod(method); > return jsonDeserializer.deserialize(parser, > DESERIALIZATION_CONTEXT.get()); > } > > @@ -2055,7 +2054,8 @@ > private final Map<Set<Class<? extends PipelineOptions>>, > Registration<?>> combinedCache = > Maps.newConcurrentMap(); > > - private final Map<Method, JsonDeserializer<Object>> deserializerCache = > Maps.newConcurrentMap(); > + private final Map<Method, Optional<JsonDeserializer<Object>>> > deserializerCache = > + Maps.newConcurrentMap(); > > private final Map<Method, Optional<JsonSerializer<Object>>> > serializerCache = > Maps.newConcurrentMap(); > {noformat} -- This message was sent by Atlassian Jira (v8.20.1#820001)