我正在使用EJB 3.1和jersey进行restapi。我希望有一个SuperResource
,如下所示,然后由实际的其余资源继承,如下所示。我现在拥有它的方式,我的@EJB
对象为空。有谁知道如何解决这个问题?
@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(...);
}
}
答案 0 :(得分:0)
MyResource
也必须是一个EJB bean,用@Stateless
注释:
@Stateless
public class MyResource extends SuperResource{
public String doGet(){
return dao.get(...);
}
}
如果您只需要注入DAO,则可以选择使用CDI将JAX-RS资源注入该DAO。如果你的资源 - 成为无状态bean,那么你需要注意某些后果(比如为每个方法启动的事务,除非你明确禁用它等)。
答案 1 :(得分: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();
}
}