2016-09-18 2 views
0

Я получаю следующее сообщение об ошибке:Java EE не удается разрешить ссылки Местного EJB-исй

Severe: Exception while deploying the app [snel-transport-web] : Cannot resolve reference Local ejb-ref name=UserFacade,Local 3.x interface =null,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session 

Я гугл ошибки, и я прибыл на следующие вопросы по Stack Overflow:

EJB Injection failure on deploy

Getting Cannot resolve reference Local ejb-ref not implementing parent interface

Я предполагаю, что это что-то делать с моими примечаниями @remote и @LocalBean.

Вот код, который я в настоящее время:

AbstractFacade.java:

@Remote 
public abstract class AbstractFacade<T> { 

    private Class<T> entityClass; 

    public AbstractFacade(Class<T> entityClass) { 
     this.entityClass = entityClass; 
    } 

    protected abstract EntityManager getEntityManager(); 

    public void create(T entity) { 
     getEntityManager().persist(entity); 
    } 

    public void edit(T entity) { 
     getEntityManager().merge(entity); 
    } 

    public void remove(T entity) { 
     getEntityManager().remove(getEntityManager().merge(entity)); 
    } 

    public T find(Object id) { 
     return getEntityManager().find(entityClass, id); 
    } 

    public List<T> findAll() { 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     return getEntityManager().createQuery(cq).getResultList(); 
    } 

    public List<T> findRange(int[] range) { 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     javax.persistence.Query q = getEntityManager().createQuery(cq); 
     q.setMaxResults(range[1] - range[0] + 1); 
     q.setFirstResult(range[0]); 
     return q.getResultList(); 
    } 

    public int count() { 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     javax.persistence.criteria.Root<T> rt = cq.from(entityClass); 
     cq.select(getEntityManager().getCriteriaBuilder().count(rt)); 
     javax.persistence.Query q = getEntityManager().createQuery(cq); 
     return ((Long) q.getSingleResult()).intValue(); 
    } 
} 

UserFacade.java:

@Stateless 
@LocalBean 
public class UserFacade extends AbstractFacade<User> { 

    @PersistenceContext(unitName = "com.mycompany_snel-transport-ejb_ejb_1.0-SNAPSHOTPU") 
    private EntityManager em; 

    @Override 
    protected EntityManager getEntityManager() { 
     return em; 
    } 

    public UserFacade() { 
     super(User.class); 
    } 
} 

AuthCtrl.java:

@Path("/auth") 
@ApplicationPath("/api") 
public class AuthCtrl extends Application { 

    com.mycompany.UserFacade userFacade = lookupUserFacadeBean(); 

    /** 
    * 
    * @return 
    */ 
    @GET 
    @Path("/user") 
    public String getHelloMsg() { 
     return "test"; 
    } 

    /** 
    * 
    * @param message 
    * @return 
    */ 
    @POST 
    @Path("/register") 
    public String register(String message) { 
     // Register user 
//  userFacade.create(entity); 

     return "done registering"; 
    } 

    private com.mycompany.UserFacade lookupUserFacadeBean() { 
     try { 
      Context c = new InitialContext(); 
      return (com.mycompany.UserFacade) c.lookup("java:global/com.mycompany_snel-transport-ear_ear_1.0-SNAPSHOT/com.mycompany_snel-transport-ejb_ejb_1.0-SNAPSHOT/UserFacade!com.mycompany.UserFacade"); 
     } catch (NamingException ne) { 
      Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne); 
      throw new RuntimeException(ne); 
     } 
    } 
} 

ответ

1

У вас есть LocalBean, который реализует интерфейс Remote (в этом случае расширяет класс, но он по-прежнему применяется). Попытайтесь изменить либо Remote на Local, либо LocalBean на RemoteBean. Если это не поможет полностью удалить аннотацию из абстрактного класса.

+0

Я пробовал свой первый вариант, но он не исправил его. Также 'RemoteBean' не существует? Я не понимаю ваш последний вариант. Вы имеете в виду, что я удаляю '@ remote' из' AbstractFacade.java' и '@ LocalBean' из' UserFacade.java'? Если это то, что вы имели в виду, то это также не устранило мою проблему. – superkytoz

+0

Нет, оставьте '@ LocalBean', это нормально, просто удалите' @ Remote' из абстрактного класса. '@ LocalBean' используется для класса без представления интерфейса, поэтому он должен работать. – Shadov

+0

Я удалил '@ Remote' из абстрактного класса. И я '@ LocalBean' в' UserFacade.java'. Но он все еще не исправил это. – superkytoz

Смежные вопросы