[ 
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)

Reply via email to