0

ユーティリティクラスのローカルStatelesセッションBeanインスタンスを検索する際に問題があります。 $ ProxyXYZ(XYZは任意の数である)

我々はすべてがEARアーカイブにパッケージ化されて

JSF2

、Glassfishの3.1.1、JPA 2、EJB 3を使用している:我々は常にClassCastExceptionが得られます。

また、私たちのプロジェクトではBean検証を使用しています。そのため、検証者クラスの1つでは、StatelessセッションBeanのインスタンスを取得しようとしています。バリデータは、このように定義されています

public class ValidadorParametroGlobal implements ConstraintValidator<ValidacionParametroGlobal, ParametroGlobal> { 

    @Override 
    public void initialize(final ValidacionParametroGlobal constraintAnnotation) { 
     try { 

      //Lookup works, jndi name is correct, but cast fails 
      ParametroGlobalBOImpl pgbo = 
        (ParametroGlobalBOImpl) new InitialContext().lookup(
        "java:global/esipren-ear/esipren-ejb/ParametroGlobalBOImpl!" + 
        "ec.gob.mf.esipren2.bo.entidad.ParametroGlobalBOLocal"); 
      LOG.info(pgbo); 
     } catch (NamingException ex) { 
      LOG.error("No se pudo recuperar el bo de parametro global en el validador"); 
      throw new IllegalStateException("No se puede ejecutar la validación", ex); 
     } 
     LOG.debug("Inicializando validador"); 
    } 
    ... MORE CODE 
} 

セッションビーン:

@Stateless 
@Local(ParametroGlobalBOLocal.class) 
@Remote(ParametroGlobalBORemote.class) 
public class ParametroGlobalBOImpl extends ParametroGlobalGenericBridgeImpl implements  ParametroGlobalBOLocal, 
     ParametroGlobalBORemote { 
    MORE code... 
} 

我々はProxyクラスのInstancceを取得するためのルックアップ・プロセスはうまく動作しますが、それをキャストするかのうではありませんセッションBeanと、このバリデータが実行されたとき、私たちは、この例外を取得:

java.lang.ClassCastException: $Proxy1519 
    at  ec.gob.mf.esipren2.validacion.ValidadorParametroGlobal.initialize(ValidadorParametroGlobal.java:64) 
    at ec.gob.mf.esipren2.validacion.ValidadorParametroGlobal.initialize(ValidadorParametroGlobal.java:41) 
    at org.hibernate.validator.engine.ConstraintTree.initializeConstraint(ConstraintTree.java:302) 
    at org.hibernate.validator.engine.ConstraintTree.createAndInitializeValidator(ConstraintTree.java:212) 
at org.hibernate.validator.engine.ConstraintTree.getInitializedValidator(ConstraintTree.java:189) 
    at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree|#] 

      [#|2011-10-28T11:46:10.814-0500|INFO|glassfish3.1.1|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=19;_ThreadName=Thread-4;|.java:135) 
    at org.hibernate.validator.metadata.MetaConstraint.validateConstraint(MetaConstraint.java:121) 
    at org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:327) 
    at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForRedefinedDefaultGroup(ValidatorImpl.java:273) 
    at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:256) 
    at org.hibernate.validator.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:210) 
    at org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:119) 
    at ec.gob.mf.esipren2.validacion.BeanValidationEventListener.validate(BeanValidationEventListener.java:56) 
at ec.gob.mf.esipren2.persistencia.dao.jpa.JpaGenericDAOImpl.crear(JpaGenericDAOImpl.java:113) 
    ... 95 more 
    |#] 

我々はまた、バリデータクラスをこのように定義しています

public class ValidadorParametroGlobal implements ConstraintValidator<ValidacionParametroGlobal, ParametroGlobal> { 

    @Override 
    public void initialize(final ValidacionParametroGlobal constraintAnnotation) { 
     try { 
      ParametroGlobalBOLocal pgbo = 
        (ParametroGlobalBOLocal) new InitialContext().lookup(
        "java:global/esipren-ear/esipren-ejb/ParametroGlobalBOImpl!" + 
        "ec.gob.mf.esipren2.bo.entidad.ParametroGlobalBOLocal"); 
      LOG.info(pgbo); 
     } catch (NamingException ex) { 
      LOG.error("No se pudo recuperar el bo de parametro global en el validador"); 
      throw new IllegalStateException("No se puede ejecutar la validación", ex); 
     } 
     LOG.debug("Inicializando validador"); 
    } 
    ... MORE CODE 
} 

しかし、同じエラーが発生します。

すべてのアイデア? GlassFishの3.1.1でローカルまたはリモートEJB参照を取得するための

答えて

0

一つの方法は、ビーンロケータ経由で(http://www.adam-bien.com/roller/abien/entry/ejb_3_1_beanlocator_whenを参照)

私Beanlocatorは(getBeanメソッドを参照してください、それは二つの引数を期待している:EJBのローカルまたはリモートクラスとポータブルEJB名):

package ec.gob.mf.esipren2.util; 

import java.io.Serializable; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.rmi.PortableRemoteObject; 
import org.apache.log4j.Logger; 

/** 
* Utilitario para recuperacion de instancias de Session Beans. 
* @author juan 
*/ 
public final class BeanLocator implements Serializable { 

    /** 
    * Version de la clase. 
    */ 
    private static final long serialVersionUID = 1L; 

    /** 
    * Logger de la clase. 
    */ 
    private static final Logger LOG = Logger.getLogger(BeanLocator.class); 

    /** 
    * Constructor por defecto. 
    */ 
    private BeanLocator() { 
    } 

    /** 
    * Metodo para recuperacion de Session Beans Locales usando un archivo de 
    * propiedades. 
    * @param <T> Interfaz del Tipo de Session Bean que se quiere recuperar 
    * @param clazz La clase que representa la interfaz del Session Bean 
    * @param nombreServicio 
    *  Nombre del servicio que se desea recuperar 
     * @return Una Instancia del Session Bean cuya interfaz es igual a la 
    * interfaz pasada como parametro 
    * @throws NamingException En caso de encontrarse un error al intentar 
    * recuperar la instancia del Session Bean 
    */ 
    public static <T> T getBean(final Class<T> clazz, final String nombreServicio) 
      throws NamingException { 
     LOG.trace("Recuperando servicio Local" + nombreServicio); 
     Context c = new InitialContext(); 
     Object o = c.lookup(nombreServicio); 
     LOG.trace("Se recuperó un proxy: " + o.getClass().getName()); 
     return clazz.cast(PortableRemoteObject.narrow(o, clazz)); 
    } 
} 

ように、ローカルEJB参照を取得するために:

public String despachar() { 
    String result; 
    try { 

     ParametroGlobalBOLocal prboLocal = BeanLocator.getBean(ParametroGlobalBOLocal.class, 
       "java:global/esipren-ear/esipren-ejb/ParametroGlobalBOImpl!" + 
       "ec.gob.mf.esipren2.bo.entidad.ParametroGlobalBOLocal"); 
     prboLocal.buscarTodos(); 
     result = "Something"; 
    } catch (NamingException ex) { 
     ex.printStackTrace(); 
     result = "error"; 
    } 
    return result; 
} 

同じアプローチを取得するために使用することができリモートEJB参照は

public String despachar1() { 
    String result; 
    try { 

     ParametroGlobalBORemote prboRemote = BeanLocator.getBean(ParametroGlobalBORemote.class, 
       "java:global/esipren-ear/esipren-ejb/ParametroGlobalBOImpl!" + 
       "ec.gob.mf.esipren2.bo.entidad.ParametroGlobalBORemote"); 
     prboRemote.buscarTodos(); 
     result = "Something"; 
    } catch (NamingException ex) { 
     ex.printStackTrace(); 
     result = "error"; 
    } 
    return result; } 

最後にこれはあなたの最初の答えのための要約として

http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB 
http://www.java.net/node/703676#comment-797861 
http://www.jguru.com/faq/view.jsp?EID=734137 

敬具 フアン

0

を興味があります。この問題は、EJB自体にキャストし、EJBのビジネス・インタフェースにキャストする必要があるために発生します。私は同じ質問をhttp://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#POJOLocalEJBここで勉強した後、同じ問題に遭遇した。幸いにも、java.netの同僚が私を助けました。ありがとう。

関連する問題