Búsqueda de WildFly JNDI para EJB local implementado en un WAR

Estoy usando WildFly 8.1.0 Versión final.

Mi aplicación es una aplicación web JavaEE implementada en un WAR (no hay ningún módulo EJB .ear).

Quiero invocar programáticamente EJB local con su nombre usando JNDI.

Los EJB solo se anotan con @Stateless (no hay interfaces locales o remotas)

Intento debajo de la función:

private <E extends DomainObject> CrudService<E> lookUp(Class<E> cl) {
    try {
        final Hashtable jndiProperties = new Hashtable();
        jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
        final Context context = new InitialContext(jndiProperties);
        // The app name is the application name of the deployed EJBs. This is typically the ear name
        // without the .ear suffix. However, the application name could be overridden in the application.xml of the
        // EJB deployment on the server.
        // Since we haven't deployed the application as a .ear, the app name for us will be an empty string
        final String appName = "";
        // This is the module name of the deployed EJBs on the server. This is typically the jar name of the
        // EJB deployment, without the .jar suffix, but can be overridden via the ejb-jar.xml
        // In this example, we have deployed the EJBs in a jboss-as-ejb-remote-app.jar, so the module name is
        // jboss-as-ejb-remote-app
        final String moduleName = "jboss-as-ejb-remote-app";
        // AS7 allows each deployment to have an (optional) distinct name. We haven't specified a distinct name for
        // our EJB deployment, so this is an empty string
        final String distinctName = "";
        // The EJB name which by default is the simple class name of the bean implementation class
        final String serviceName = cl.getSimpleName() + "Service";
        // let's do the lookup
        return (CrudService<E>) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + serviceName );
        //return (CrudService<E>) context.lookup(serviceName);
    } catch (NamingException e) {
        log.error("NamingException {}",e) ;
        throw new RuntimeException(e) ;
    }
}

pero no funciona (obviamente es para EJB remoto)

Pero no encuentro ningún ejemplo para EJB local en un WAR con WildFly y no tengo idea de cómo hacerlo, no uso JNDI a menudo ...

Encontré un trabajo alrededor de anotar EJB con @Named (value = "EjbClassName") e invocarlos usando JSF.

FacesContext context = FacesContext.getCurrentInstance() ;
return context.getApplication().evaluateExpressionGet(context, "#{"+cl.getSimpleName()+"Service}", CrudService.class) ;

Y está funcionando

pero preferiría no usar JSF ya que no está relacionado con la capa de vista.

Respuestas a la pregunta(2)

Su respuesta a la pregunta