Search code examples
javadependency-injectionejbcdiglassfish-3

CDI and EJB mix with glassfish 3.1


I have two application deployed on glassfish - application A and B.

Both are deployed as war package, application B uses some components from application A.

Now in application A I have an interface:

public interface BusinessInterface() extends SomeOtherInterface {
    void someAction();
}

I have 3 implementations of this interface - two in application A, one in application B: BusinessInterfaceA1, BusinessInterfaceA2, BusinessInterfaceB

As long as all of them are CDIBeans, everything is fine - I'm using custom @Qualifier annotations (@BusinessInterfaceA1, @BusinessInterfaceA2) and @Default annotation for B's implementation to distinguish them.

But now I need both application's A implementations to be Stateful EJBs and this is where it becomes funny.

When I just add @Statefull annotation on both implementations, a I got something like this:

javax.servlet.ServletException: org.jboss.weld.exceptions.WeldException: WELD-000049

details:

java.lang.IllegalStateException: Unable to convert ejbRef for ejb BusinessInterfaceA1 to a business object of type interface SomeOtherInterface

How can I fix it? I need all implementations to be avaliable in a way I could inject them like

@Inject @SomeAnnotation private BusinessInterface businessInterface;

Solution

  • It is bug in Glassfish 3.1. The workaround is, to mark implementation with all required interfaces, e.g.:

    @Statefull/@Stateless
    public class BusinessInterfaceImpl implements BusinessInterface, SomeOtherInterface {
       // implementation
    }
    

    Even BusinessInterface extends SomeOtherInterface, and from Java specs its useless to do that, but as a workaround for that bug it works.

    Another solution is to use Glassfish 4.0