[
https://issues.apache.org/jira/browse/BROOKLYN-406?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15754652#comment-15754652
]
ASF GitHub Bot commented on BROOKLYN-406:
-----------------------------------------
Github user neykov commented on a diff in the pull request:
https://github.com/apache/brooklyn-server/pull/477#discussion_r92826864
--- Diff:
utils/common/src/test/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercionsTest.java
---
@@ -344,6 +344,59 @@ public void testFrom() {
}
@Test
+ public void testFromThrowingException() {
+ String expectedGenericErr = "Cannot coerce type class " +
String.class.getName() + " to " +
WithFromThrowingException.class.getCanonicalName();
+ String expectedSpecificErr = "Simulating problem in fromString";
+
+ try {
+ coercer.coerce("myval", WithFromThrowingException.class);
+ Asserts.shouldHaveFailedPreviously();
+ } catch (ClassCoercionException e) {
+ Asserts.expectedFailureContains(e, expectedGenericErr,
expectedSpecificErr);
+ }
+
+ try {
+ coercer.tryCoerce("myval",
WithFromThrowingException.class).get();
+ Asserts.shouldHaveFailedPreviously();
+ } catch (ClassCoercionException e) {
+ Asserts.expectedFailureContains(e, expectedGenericErr,
expectedSpecificErr);
+ }
+ }
+
+ // TODO Asserting this undesirable behaviur, to preserve backwards
compatibility!
+ // Would much prefer that we fail-fast. However, I worry that some
entity's jave declared
--- End diff --
typo `jave`
> Coercion using fromMap(map) - exception thrown away, and value not coerced
> --------------------------------------------------------------------------
>
> Key: BROOKLYN-406
> URL: https://issues.apache.org/jira/browse/BROOKLYN-406
> Project: Brooklyn
> Issue Type: Bug
> Reporter: Aled Sage
> Fix For: 0.9.0
>
>
> We had a {{ConfigKey<List<VolumeOptions>>}}, and were setting that in YAML
> using a map. We expected {{VolumeOptions.fromMap(map)}} to be called as part
> of {{getConfig(VOLUMES, val)}}. This does indeed happen.
> However, if {{VolumeOptions.fromMap(map)}} throws an exception (e.g. because
> the input data was malformed), it does not report any problems and instead
> the {{getConfig}} just returns a list containing uncoerced map objects. As a
> result, we subsequently got a {{ClassCastException}} in our entity code.
> This was extremely hard to figure out - it involved attaching a debugger,
> breakpointing and stepping through the coercion code.
> ---
> Digging into the underlying cause, the problem is in this stacktrace:
> {noformat}
> "brooklyn-execmanager-PRYA08PS-104" daemon prio=5 tid=0x00007f82096c7000
> nid=0x14f0b runnable [0x0000700005eac000]
> java.lang.Thread.State: RUNNABLE
> at
> org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.tryCoerceWithFromMethod(TypeCoercerExtensible.java:204)
> at
> org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.tryCoerceInternal(TypeCoercerExtensible.java:135)
> at
> org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.tryCoerce(TypeCoercerExtensible.java:107)
> at
> org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.tryCoerceCollection(TypeCoercerExtensible.java:263)
> at
> org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.tryCoerceInternal(TypeCoercerExtensible.java:121)
> at
> org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.tryCoerce(TypeCoercerExtensible.java:107)
> at
> org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.coerce(TypeCoercerExtensible.java:97)
> at
> org.apache.brooklyn.util.core.flags.TypeCoercions.coerce(TypeCoercions.java:80)
> at
> org.apache.brooklyn.util.core.config.ConfigBag.coerceFirstNonNullKeyValue(ConfigBag.java:502)
> at
> org.apache.brooklyn.util.core.config.ConfigBag.get(ConfigBag.java:496)
> at
> org.apache.brooklyn.util.core.config.ConfigBag.get(ConfigBag.java:344)
> {noformat}
> The {{TypeCoercerExtensible.tryCoerceWithFromMethod}} accidentally throws
> away the exception! It is therefore treated as though there was no applicable
> coercion. However, because {{List<Map>}} can be cast to {{List}} then it
> returns it anyway.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)