Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > EJB 2.0 ejbLoad() NullPointerException


Автор: MaxPayneC 3.6.2010, 09:06
Здравствуйте. Есть бин, у него есть несколько инстанс-полей и метод ejbLoad():

Код

    public void ejbLoad() throws RemoteException
    {
        Properties properties = new Properties();
        properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        properties.put(Context.PROVIDER_URL, "localhost:1099");
        try
        {
            Context initialContext = new InitialContext(properties);

            Connection connection = ((DataSource) initialContext.lookup("java:jbdc/oracle/test")).getConnection();
            try
            {
                PreparedStatement loadStatement = connection.prepareStatement("select car_name from cards where car_id = ?");
                try
                {
                    loadStatement.setInt(1, this.id);
                    ResultSet carInfoResultSet = loadStatement.executeQuery();
                    try
                    {
                        if (!carInfoResultSet.next())
                        {
                            throw new FinderException("Car not found");
                        }

                        this.name = carInfoResultSet.getString(1);
                    }
                    finally
                    {
                        carInfoResultSet.close();
                    }
                }
                finally
                {
                    loadStatement.close();
                }
            }

            finally

            {
                connection.close();
            }

        }
        catch (Exception ex)
        {
            throw new RemoteException("Exception while removing entity", ex);
        }

    }


Когда клиент вызывает remove() на home-интерфейсе, контейнер вызывает ejbLoad() и случается NullPointerException на строке 16, вызванная тем, что инстанс-поле с основным ключом есть null. В чем может быть причина этого?

Автор: MaxPayneC 3.6.2010, 10:13
Дополнительные подробности: работает это все под сановской жвм 1.6.0.20, апп-сервер жбосс 4.2.3.

Очень интересно ведет себя бин: при вызове remove() и соответствующем вызове ejbLoad() контейнером this.entityContext.getPrimaryKey() возвращает объект класса remote-интерфейса бина. При вызове же ejbStore() (скажем, при попытке поменять значения полей) - this.entityContext.getPrimaryKey() возвращает Integer. Дескриптор развертывания:

Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
        "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
    <description>com.netcracker.ejbtest.bmp.Car deployment descriptor</description>
    <display-name>com.netcracker.ejbtest.bmp.Car</display-name>
    <enterprise-beans>
        <entity>
            <description>com.netcracker.ejbtest.bmp.Car deployment descriptor
            </description>
            <display-name>Car</display-name>
            <ejb-name>Car</ejb-name>
            <home>com.netcracker.ejbtest.bmp.CarHome</home>
            <remote>com.netcracker.ejbtest.bmp.Car</remote>
            <ejb-class>com.netcracker.ejbtest.bmp.CarBean</ejb-class>
            <persistence-type>Bean</persistence-type>
            <prim-key-class>java.lang.Integer</prim-key-class>
            <reentrant>False</reentrant>
            <abstract-schema-name>Car1</abstract-schema-name>
        </entity>
    </enterprise-beans>
</ejb-jar>


Судя по странному поведению метода getPrimaryKey(), я где-то накосячил именно в дескрипторе. Никто не подскажет, где именно?

Автор: MaxPayneC 3.6.2010, 12:30
Как обычно, проблема в моих кривых руках smile Вызывал у home-интерфейса home.remove(car), в то время как следует home.remove(id).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)