неразрешенный - PullRequest
       68

неразрешенный

3 голосов
/ 16 июня 2011

Я занимаюсь разработкой в ​​NetBeans 7, с EJB3.1 и Glassfish 3.1. Я пытаюсь сослаться на локальный интерфейс сессионного компонента в JAR из POJO в WAR. При развертывании на Glassfish я получаю:

SEVERE: Unresolved <ejb-link>: TaskTool-ejb#ContextFacade
SEVERE: Exception while deploying the app [com.oracle.eas_TaskTool-ear_ear_1.0-SNAPSHOT]
SEVERE: Error: Unresolved <ejb-link>: TaskTool-ejb#ContextFacade

Я использовал помощник NetBeans для генерации кода, ссылающегося на локальный интерфейс Session Bean, и он создал для меня раздел <ejb-local-ref> в web.xml.

@Local
public interface ContextFacadeLocal {
    void create(Context context);
    void edit(Context context);
    void remove(Context context);
    Context find(Object id);
    List<Context> findAll();
    List<Context> findRange(int[] range);
    int count();
    List<Context> findRootContexts();
}

@Stateless
public class ContextFacade extends AbstractFacade<Context> implements ContextFacadeLocal {
    @PersistenceContext(unitName = "TaskToolPU")
    private EntityManager em;

    protected EntityManager getEntityManager() {
        return em;
    }

    public ContextFacade() {
        super(Context.class);
    }

    @Override
    public List<Context> findRootContexts() {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<Context> query = builder.createQuery(Context.class);
        Root<Context> c = query.from(Context.class);
        query.select(c).where(builder.isNull(c.get("parent")));
        query.orderBy(builder.asc(c.get("id")));

        TypedQuery<Context> q = em.createQuery(query);
        return q.getResultList();
    }
}

@FacesConverter(value = "contextConverter")
public class contextConverter implements Converter {

    ContextFacadeLocal contextFacade = lookupContextFacadeLocal();

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
        return contextFacade.find(string);
    }

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object o) {ntityManager() {
        return em;
    }

    public ContextFacade() {
        super(Context.class);
    }

    @Override
    public List<Context> findRootContexts() {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<Context> query = builder.createQuery(Context.class);
        Root<Context> c = query.from(Context.class);
        query.select(c).where(builder.isNull(c.get("parent")));
        query.orderBy(builder.asc(c.get("id")));

        TypedQuery<Context> q = em.createQuery(query);
        return q.getResultList();
    }
}

@FacesConverter(value = "contextConverter")
public class contextConverter implements Converter {

    ContextFacadeLocal contextFacade = lookupContextFacadeLocal();

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
        return contextFacade.find(string);
    }

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object o) {
        return ((Context) o).getId().toString();
    }

    private ContextFacadeLocal lookupContextFacadeLocal() {
        try {
            javax.naming.Context c = new InitialContext();
            //return (ContextFacadeLocal) c.lookup("java:global/com.oracle.eas_TaskTool-ear_ear_1.0-SNAPSHOT/com.oracle.eas_TaskTool-ejb_ejb_1.0-SNAPSHOT/ContextFacade!com.oracle.eas.ejbs.ContextFacadeLocal");
            return (ContextFacadeLocal) c.lookup("java:comp/env/TaskTool-ejb#ContextFacade");

        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }
}


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
    <ejb-local-ref>
        <ejb-ref-name>ContextFacade</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>
        <local>com.oracle.eas.ejbs.ContextFacadeLocal</local>
        <ejb-link>TaskTool-ejb#ContextFacade</ejb-link>
    </ejb-local-ref>
</web-app>

UPDATE

Для ясности:

У меня вообще нет ejb-jar.xml.

Использование <ejb-link>TaskTool-ejb/ContextFacade</ejb-link> или <ejb-link>com.oracle.eas_TaskTool-ejb_ejb_1.0-SNAPSHOT/ContextFacade</ejb-link> работает.

Пожалуйста, смотрите ответы bkail ниже для объяснения. Большое спасибо!

Ответы [ 4 ]

7 голосов
/ 02 октября 2014

У меня была такая же проблема при попытке развернуть мое приложение, NetBeans сгенерировал этот код в моем файле web.xml самостоятельно.

Проверьте ваш web.xml и посмотрите, видите ли вы это:

<ejb-local-ref>
        <ejb-ref-name>appName</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>
        <ejb-link>AppName#SomeClass</ejb-link>
    </ejb-local-ref>

Если это так, просто удалите его полностью, оно должно развернуться после.

2 голосов
/ 17 июня 2011

Как называется ваш модуль EJB?Если файл jar не назван буквально «TaskTool-ejb.jar», то вам нужно использовать либо:

<ejb-link>TaskTool-ejb.jar#ContextFacade</ejb-link>

, либо:

<ejb-link>TaskTool-ejb/ContextFacade</ejb-link>

В последнем предполагается, что вы не переопределилиимя модуля в ejb-jar.xml.

Обновление: на основе вашего собственного комментария, возможно, вам нужно использовать "com.oracle.eas_TaskTool-ejb_ejb_1.0-SNAPSHOT.jar # ContextFacade" или "com.oracle.eas_TaskTool-ejb_ejb_1.0-ПАНОРАМА / ContextFacade».

0 голосов
/ 02 декабря 2014

Похоже, что TomEE не использует EAR> EJB / WAR classloader, и они обрабатываются в режиме единой войны, 'MyEjbJar # MyEJB' не может использоваться в качестве цели ejb-link, мы должны изменить

    <ejb-link>MyEjb.jar#MyEJB</ejb-link>

в /WEB-INF/web.xml до

    <ejb-link>MyEJB</ejb-link>  

вместо.

0 голосов
/ 12 июля 2014

У меня была такая же проблема. Отрывок из журнала Glassfish:

SEVERE:   Exception while deploying the app [.....] : Error: Unresolved <ejb-link>: #NotifyMe

Когда вы используете аннотации в веб-сервисе (что настоятельно рекомендуется), удалите все строки из sun-web.xml, которые касаются веб-сервиса.

т.е. на моем sun-web.xml есть только основные сведения:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD GlassFish Application Server 3.0 Servlet 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_3_0-0.dtd">
<sun-web-app error-url="">
  <class-loader delegate="true"/>
  <jsp-config>
    <property name="keepgenerated" value="true">
      <description>Keep a copy of the generated servlet class' java code.</description>
    </property>
  </jsp-config>
</sun-web-app>

Как видите, в приложении нет ничего конкретного.

...