带有local和localbean的java服务可能会导致org.jboss.weld.exceptions.weldeexception:对象不是声明类的示例

fslejnso  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(270)

通过上面的代码,我得到了一个随机的结果:大多数情况下,下面的代码工作正常,但在一些罕见的情况下,对“service.get()”的调用会导致异常“org.jboss.weld.exceptions.weldeexception:object不是声明类的示例”。
在这种情况下,注入的服务类似于“proxy for view class:package.iservicea of ejb:serviceinpl”(通过@local接口之一注入),而不是“proxy for view class:package.serviceinpl of ejb:serviceinpl”(通过@localbean类注入)。
我不明白的是为什么这种行为是不可预测的?为什么同一代码有两种可能的情况(行为随部署的不同而变化)
我们正在使用wildfly 8.1.0。有没有我们不知道的bug?

import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.inject.Inject;

@Local
public interface IServiceA {

}

@Local
public interface IServiceB<E> {
    E get();
}

public abstract class AbstractService<T extends SomeRootType> implements IServiceA, IServiceB<T> {

    @Override
    public T get() {
        // Some code
    }

}

@Stateless
@LocalBean
public class ServiceImpl extends AbstractService<SomeType> implements IServiceA, IServiceB<SomeType> {

}

public class SomeRootType {}
public class SomeType extends SomeRootType {}

public class ExampleA {

    @Inject
    ServiceImpl service;

    public void execute() {
        /*
        Sometimes, injected service is "Proxy for view class: package.IServiceA of EJB: ServiceImpl" and cause "org.jboss.weld.exceptions.WeldException: object is not an instance of declaring class".
        Rest of the time, injected service is "Proxy for view class: package.ServiceImpl of EJB: ServiceImpl" and works fine.
        */
        service.get();
    }

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题