[weld-issues] [JBoss JIRA] (WELD-904) Observer method inheritance broken

Ales Justin (Commented) (JIRA) jira-events at lists.jboss.org
Mon Nov 14 09:58:40 EST 2011


    [ https://issues.jboss.org/browse/WELD-904?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12642549#comment-12642549 ] 

Ales Justin commented on WELD-904:
----------------------------------

The problem is in @Specializes not being properly applied.

Foo's onEvent method is the only proper resolver in this case.
And that's what gets matched -- where it probably shouldn't since Foo is specialized, hence should be excluded? 
But since Bar specializes Foo, this observer method is invoked against Bar instance.

@Pete: how do we treat beans that have specialized sub-beans? Completely exclude them in the BDA on their specialized sub-bean?


                
> Observer method inheritance broken
> ----------------------------------
>
>                 Key: WELD-904
>                 URL: https://issues.jboss.org/browse/WELD-904
>             Project: Weld
>          Issue Type: Bug
>          Components: Events
>    Affects Versions: 1.1.1.Final
>            Reporter: Christian Bauer
>            Priority: Minor
>
> {code}
> /*
> <beans xmlns="http://java.sun.com/xml/ns/javaee"
>        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
>     <alternatives>
>         <class>Foo$Bar</class>
>     </alternatives>
> </beans>
>  */
> @ApplicationScoped
> public class Foo {
>     public static void main(String[] args) {
>         WeldContainer weld = new Weld().initialize();
>         weld.event().select(MyEvent.class).fire(new MyEvent());
>     }
>     static class MyEvent {
>     }
>     @Qualifier
>     @Target({FIELD, PARAMETER})
>     @Retention(RUNTIME)
>     public @interface SomeQualifier {
>     }
>     @PostConstruct
>     void init() {
>         System.out.println("INIT FOO");
>     }
>     void onEvent(@Observes MyEvent e) {
>         System.out.println("EVENT FOO");
>     }
>     @Alternative
>     @Specializes
>     static public class Bar extends Foo {
>         @Override
>         void init() {
>             System.out.println("INIT BAR");
>         }
>         @Override
>         void onEvent(@Observes @SomeQualifier MyEvent e) {
>             System.out.println("EVENT BAR");
>         }
>     }
> }
> {code}
> The expected output is:
> INIT BAR
> The actual output is:
> INIT BAR
> EVENT BAR
> Removing the @SomeQualifier annotation on the Bar#onEvent() method results in:
> INIT BAR
> EVENT BAR
> EVENT BAR
> Removing also the @Observes annotation on the Bar#onEvent() method results in:
> INIT BAR
> EVENT BAR
> One or several of these outcomes is wrong. Also, section 4.2 of the spec says that observer methods are only inherited if the subclass doesn't override the method. I'm confused why everyone (e.g. https://issues.jboss.org/browse/CDITCK-186) seems to assume the exact opposite.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the weld-issues mailing list