0

RESTAPI に EJB 3.1 と jersey を使用しています。以下のようにしたいと思いSuperResourceます。これは、以下のように実際の残りのリソースに継承されます。私が今持っている方法では、私の@EJBオブジェクトはnullです。これを修正する方法を知っている人はいますか?

@Stateless
public class SuperResource {
    @EJB
    protected GenericDao<DomainObject> dao;
    . . .
}


public class MyResource extends SuperResource{     
    public String doGet(){
       return dao.get(...);
   }
}

@Stateless@Local、 、SuperResourceの間の真理値表全体を試しましたMyResource。順列はどれも機能していないようです。

それが重要かどうかはわかりません。私のサーバーは Glassfish 3.1.2 です。

編集して詳細を追加:

私はそうは思いませんでしたが、ここでさらに詳細が必要なようです:

私のアプリケーションの構造:

@Local
public interface GenericDao<T extends DomainObject> {…}

public interface LoginDao  extends GenericDao<Login>{...}

@Stateless
public class GenericDaoImpl<T extends DomainObject> implements GenericDao<T> {…}

@Stateless
public class LoginDaoImpl extends GenericDaoImpl<Login> implements LoginDao {…}

@Entity
public class Login implements java.io.Serializable, DomainObject {…}

機能するもの:

@Stateless
@Path("mypath")
public class MyResource{   
@EJB
private LoginDao dao;  
  public String doGet(){
    return dao.get(...);
  }
}
4

2 に答える 2

0

MyResourceで注釈を付けることにより、EJB Bean にする必要があります@Stateless

@Stateless
public class MyResource extends SuperResource{     
    public String doGet(){
       return dao.get(...);
   }
}

注入された DAO のみが必要な場合は、代わりに CDI を使用して、その DAO で JAX-RS リソースを注入することを選択できます。リソースがステートレス Bean になる場合、これには注意が必要な特定の結果があります (明示的に無効にしない限り、すべてのメソッドに対してトランザクションが開始されるなど)。

于 2012-10-07T21:33:48.127 に答える
0

EJB インジェクションの問題のようです。サーバーによっては、mappedName/name/beanName をいじる必要があります。

私が確認できるのは、次のコードが JBoss 7.1.1 で動作することです。

        @Local
        public interface HelloWorldLocal {
            public String sayHello();
        }

        @Stateless
        public class HelloWorldBean implements HelloWorldLocal {
            public String sayHello(){
                return "Hello..............................................................................";
            }
        }

        @Remote
        public interface BaseRemote {
            public String test();
        }

        @Stateless
        public class BaseBean implements BaseRemote{
            @EJB
            HelloWorldLocal bean;
            public String test() {
                return "Base Bean";
            }
        }

        @Remote
        public interface DerivedRemote {
            String test();
        }

        @Stateful
        public class DerivedBean extends BaseBean implements DerivedRemote{
            public String test() {
                return bean.sayHello();
            }
        }
于 2012-10-15T09:29:13.277 に答える