You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@beam.apache.org by "chris stockton (Jira)" <ji...@apache.org> on 2019/11/15 04:35:00 UTC
[jira] [Created] (BEAM-8669) Default methods not allowed in
PipelineOptions
chris stockton created BEAM-8669:
------------------------------------
Summary: Default methods not allowed in PipelineOptions
Key: BEAM-8669
URL: https://issues.apache.org/jira/browse/BEAM-8669
Project: Beam
Issue Type: Bug
Components: beam-model
Affects Versions: 2.16.0
Reporter: chris stockton
If I create a class that extends PipelineOptions and contains a default method, the PipelineOptionsFactory will throw an exception because all non-static, non-synthetic and non-known methods need to have a getter and a setter.
For example, these PipelineOptions
{code:java}
public interface MyOptions extends PipelineOptions {
void setValue(String s);
String getValue();
default List<String> getValues() {
return Arrays.asList(getValue().split(","));
}
}{code}
will throw an exception in org.apache.beam.sdk.options.PipelineOptionsFactory.java:
{code:java}
private static void validateMethodsAreEitherBeanMethodOrKnownMethod(
Class<? extends PipelineOptions> iface,
Class<? extends PipelineOptions> klass,
List<PropertyDescriptor> descriptors) {
...
// Verify that no additional methods are on an interface that aren't a bean property.
// Because methods can have multiple declarations, we do a name-based comparison
// here to prevent false positives.
SortedSet<Method> unknownMethods = new TreeSet<>(MethodComparator.INSTANCE);
unknownMethods.addAll(
Sets.filter(
Sets.difference(Sets.newHashSet(iface.getMethods()), knownMethods),
Predicates.and(
NOT_SYNTHETIC_PREDICATE,
input -> !knownMethodsNames.contains(input.getName()),
NOT_STATIC_PREDICATE)));
checkArgument(
unknownMethods.isEmpty(),
"Methods %s on [%s] do not conform to being bean properties.",
FluentIterable.from(unknownMethods).transform(ReflectHelpers.METHOD_FORMATTER),
iface.getName());
}{code}
Having a NOT_DEFAULT_PREDICATE in addition to the other predicates would allow
{code:java}
private static final Predicate<Method> NOT_DEFAULT_PREDICATE = input -> !input.isDefault();
{code}
Seems like it would do the trick.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)