Неліктен java.lang.ClassCastException: $ Proxy, Glassfish 3.1.1 бағдарламасындағы Stateless Session Bean-ті іздеуде

Жергілікті Stateles сеансын Bean данасын утилита сыныбында іздеуде қиындықтар бар. Біз әрдайым ClassCastException аламыз: $ ProxyXYZ (XYZ - кез келген нөмір)

Біз Glassfish 3.1.1, JPA 2, EJB 3, JSF2-ді қолданамыз

Барлығы құлақ мұрағатына оралған.

Біз сондай-ақ жобамызда Bean Validation пайдалануымыз керек, сондықтан біздің валидатор классымыздың бірінде біз Стататесіз сеанстың бұршағы болуға тырысамыз. Валидатор келесі жолмен анықталады:

public class ValidadorParametroGlobal implements ConstraintValidator {

    @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 сыныбының мәнін аламыз, бірақ оны Session 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 {

    @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
}

Бірақ біз бірдей қатені аламыз.

Кез-келген идеялар?

0

2 жауаптар

Алғашқы жауап үшін қорытынды. Мәселе EJB-ге өзіңіз жібергендіктен және EJB-дің іскери интерфейсіне ауысуыңыз керек. Сұрақ-жауапты зерттегеннен кейін мен сол қиындыққа тап болдым http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#POJOLocalEJB . Бақытымызға орай, java.net сайтындағы әріптестерім маған көмектесті. Оларға үлкен рахмет.

0
қосылды

Жергілікті немесе қашықтан жасалған ejb анықтамасын алудың бір әдісі 3.1.1 шыны бусинкісінде Bean Locator арқылы (қараңыз: http://www.adam-bien.com/roller/abien/entry/ejb_3_1_beanlocator_when )

My Beanlocator (GetBean әдісін қараңыз, ол екі дәлелді күтеді: Ejb's Local немесе Remote class және портативті 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  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 getBean(final Class 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
қосылды