简体   繁体   中英

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 AI 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;

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

@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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM