Как решить ошибку Java EE EJB Glassfish javax.naming.NamingException: исключение при вызове: получен нулевой ComponentInvocation? - PullRequest
0 голосов
/ 11 декабря 2019

У меня проблема с созданием простой базы данных с EJB. Я создал веб-проект в Netbeans с Maven. Я использую Glassfish 5, но проблема также возникает с Glassfish 4.

Вот мои уроки.

Ui_model.java:

@Named("model")
@Stateless
public class Ui_model implements Serializable{

    @Inject 
    PizzaRepository pizzas;

    public Ui_model() {
    }

    @PostConstruct
    public void init(){

        Pizza one = new Pizza(1, "Pizza Margaritta", 4.5);
        Pizza two = new Pizza(2, "Pizza Napoli", 5);
        Pizza three = new Pizza(3, "Pizza Calzone", 6);

        pizzas.createDB(one);
        pizzas.createDB(two);
        pizzas.createDB(three);  
    }
}

PizzaRepository.java:

@Named
@ApplicationScoped
public class PizzaRepository implements Serializable{
    @PersistenceContext(unitName="Unit")
    protected EntityManager em;

    public void createDB(Pizza pizza){
        try{
            em.persist(pizza);
        }catch(RollbackException e){
            System.out.println(e.getMessage());
        }

    }
}

Pizza.java:

@Entity
public class Pizza implements Serializable{
    @Id
    int number;
    String name;
    double price;

    public Pizza(int number, String name, double price) {
        this.number = number;
        this.name = name;
        this.price = price;
    }
    public Pizza(){

    }
}

Это мой файл persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="Unit" transaction-type="JTA">
        <jta-data-source>java:app/jdbc/testdb</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <!-- database connection -->
            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
        </properties>
    </persistence-unit>
</persistence>

Это мой glassfish-resources.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
    <jdbc-connection-pool allow-non-component-callers="false" 
                          associate-with-thread="false" 
                          connection-creation-retry-attempts="0" 
                          connection-creation-retry-interval-in-seconds="10" 
                          connection-leak-reclaim="false" 
                          connection-leak-timeout-in-seconds="0" 
                          connection-validation-method="auto-commit" 
                          datasource-classname="org.apache.derby.jdbc.ClientDataSource" 
                          fail-all-connections="false" idle-timeout-in-seconds="300" 
                          is-connection-validation-required="false" 
                          is-isolation-level-guaranteed="true" 
                          lazy-connection-association="false" 
                          lazy-connection-enlistment="false" 
                          match-connections="false" 
                          max-connection-usage-count="0" 
                          max-pool-size="32" 
                          max-wait-time-in-millis="60000" 
                          name="derby_net_testdb_usernamePool" 
                          non-transactional-connections="false" 
                          pool-resize-quantity="2" 
                          res-type="javax.sql.DataSource" 
                          statement-timeout-in-seconds="-1" 
                          steady-pool-size="8" 
                          validate-atmost-once-period-in-seconds="0" 
                          wrap-jdbc-objects="false">
        <property name="serverName" value="localhost"/>
        <property name="portNumber" value="1527"/>
        <property name="databaseName" value="testdb"/>
        <property name="User" value="username"/>
        <property name="Password" value="123456"/>
        <property name="URL" value="jdbc:derby://localhost:1527/testdb"/>
        <property name="driverClass" value="org.apache.derby.jdbc.ClientDriver"/>
    </jdbc-connection-pool>
    <jdbc-resource enabled="true" 
                   jndi-name="java:app/jdbc/testdb" 
                   object-type="user" 
                   pool-name="java:app/derby_net_testdb_usernamePool"/>
</resources>

Структура моего проекта: My project structure:

При запуске я получаю следующую ошибку:

enter image description here

Странно то, что в тестовой базе данных по-прежнему создается пустая таблица с именем Pizza, но без записей. Так что это не значит, что программа не находит саму БД. Я действительно не знаю, что делать с этой ошибкой. Первоначально проект был намного больше, но я разбил его, чтобы решить основную проблему, и это не намного легче, чем это. Тем не менее это не работает. Буду признателен за любой совет, как это исправить.

Редактировать: приглашения asadmin list-jndi-записи:

java:global: com.sun.enterprise.naming.impl.TransientContext
UserTransaction: com.sun.enterprise.transaction.startup.TransactionLifecycleService$2
__internal_java_app_for_app_client__testdb__java:app: com.sun.enterprise.naming.impl.TransientContext
concurrent: com.sun.enterprise.naming.impl.TransientContext
com.sun.enterprise.container.common.spi.util.InjectionManager: com.sun.enterprise.container.common.impl.util.InjectionManagerImpl
jms: com.sun.enterprise.naming.impl.TransientContext
ejb: com.sun.enterprise.naming.impl.TransientContext
jdbc: com.sun.enterprise.naming.impl.TransientContext
Command list-jndi-entries executed successfully.

asadmin list-jndi-записи --context jdbc приглашения:

__default: org.glassfish.resourcebase.resources.api.ResourceProxy
__TimerPool: org.glassfish.resourcebase.resources.api.ResourceProxy
sample: org.glassfish.resourcebase.resources.api.ResourceProxy
Command list-jndi-entries executed successfully.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2019

Мне удалось решить проблему, поместив glassfish.xml в установочный файл в src. Я также получил помощь от друга, который дал мне свои файлы.

glassfish.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
    <resources>
        <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="org.apache.derby.jdbc.ClientDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="derby_net_testdb_pizzaPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
            <property name="serverName" value="localhost"/>
            <property name="portNumber" value="1527"/>
            <property name="databaseName" value="testdb"/>
            <property name="User" value="username"/>
            <property name="Password" value="123456"/>
            <property name="connectionAttributes" value=";create=true" />
            <property name="URL" value="jdbc:derby://localhost:1527/testdb;create=true"/>
            <property name="driverClass" value="org.apache.derby.jdbc.ClientDriver"/>
        </jdbc-connection-pool>
        <jdbc-resource enabled="true" jndi-name="jdbc/testdb" object-type="user" pool-name="derby_net_testdb_pizzaPool"/>
    </resources>

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="Unit" transaction-type="JTA">
    <jta-data-source>jdbc/testdb</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <!--<property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/ModulDB"/>
        <property name="javax.persistence.jdbc.user" value="pizza"/>
        <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
        <property name="javax.persistence.jdbc.password" value="123456"/>-->
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
    </properties>
  </persistence-unit>
</persistence>

Однако затем я получил ошибку Не удалось создать EJB без сохранения состояния из-за постоянного вызова. Это я мог решить, не вызывая createDB () в initCon (PostConstruct). Я не знаю почему, но он не работал с пост-конструкцией. Пока все работает нормально. Спасибо всем большое.

0 голосов
/ 12 декабря 2019

Мне кажется, проблема в том, что jdbc-resource pool-name и jdbc-connection-pool name не совпадают. Первый имеет префикс java:app/. Попробуйте удалить это.

См. Здесь минимальный пример: https://github.com/payara/Payara-Examples/blob/master/payara-micro/database-ping/src/main/webapp/WEB-INF/glassfish-resources.xml

...