Ejb не будет инициализировать менеджер сущностей - PullRequest
0 голосов
/ 28 ноября 2018

мой английский не мой родной язык, поэтому я прошу прощения за мой плохой английский.Мой проект работает хорошо, когда я управляю транзакцией с менеджером сущностей, фабрикой сущностей и получаю транзакции.Я хочу использовать ejb для обработки транзакций для меня.Я сделал все необходимое, чтобы он работал, но ejb не инициализирует менеджера сущностей, и он останется нулевым.Я не могу понять, что я делаю неправильно.я настроил мой persistance.xml с источником данных jta и сделал все необходимые аннотации, но все еще не могу заставить его работать.что я пытаюсь создать запрос, я получаю исключение нулевого указателя и менеджер сущностей является нулевым.Я искал и искал решение, но не смог.Я надеюсь, что кто-то здесь может найти ответ.Спасибо за ваше время!

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="swap" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>java:jboss/datasources/swap</jta-data-source>

		<class>org.Roper.WebService.Model.User</class>
		<class>org.Roper.WebService.Model.BaseEntity</class>
		<class>org.Roper.WebService.Model.Person</class>
		<class>org.Roper.WebService.Model.Admin</class>
		<class>org.Roper.WebService.Model.BusinessOwner</class>
		<class>org.Roper.WebService.Model.Business</class>
		<class>org.Roper.WebService.Model.Product</class>
		<class>org.Roper.WebService.Model.Category</class>
		<class>org.Roper.WebService.Model.Tourist</class>

		<exclude-unlisted-classes>false</exclude-unlisted-classes>
		<properties>
			<!-- Hibernate properties -->
			<property name="javax.persistence.jdbc.driver"
				value="org.postgresql.Driver" /> <!-- DB Driver -->
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.connection.zeroDateTimeBehavior"
				value="convertToNull" />
			<property name="hibernate.show_sql" value="false" />
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.dialect"
				value="org.hibernate.dialect.PostgreSQLDialect" />
			<property name="hibernate.transaction.jta.platform"
				value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform" />
			<!-- Database properties -->
			<property name="javax.persistence.jdbc.url"
				value="jdbc:postgresql://hidden/swap?useUnicode=yes&amp;characterEncoding=UTF-8" /> <!-- BD Mane -->
			<property name="javax.persistence.jdbc.user" value="hidden" /> <!-- DB User -->
			<property name="javax.persistence.jdbc.password"
				value="hidden" /> <!-- DB Password -->
		</properties>
	</persistence-unit>
</persistence>

Это основной класс, который вызывает ejb:

@Path("PersonService")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class PersonResource {
    private static final Logger logger = Logger.getLogger(PersonResource.class);

    @EJB
    PersonService personService = new PersonService();

    @GET
    @Path("/users")
    public List<Person> getUsers(@BeanParam FilterBean fb)
    {
        logger.info("Getting all users.");
        return personService.GetAllUsers();
    }
}

Это класс обслуживания, который вызывает управляющий объект:

    @Stateless
@LocalBean
public class PersonService {

    private static final Logger logger = Logger.getLogger(PersonService.class);

    @PersistenceContext(unitName="swap")
    public EntityManager em;

    /**
     *This function is querying the database selecting all the person entities.
     *@return List of all the users from the database.
     */
    public List<Person> GetAllUsers()
    {
        logger.debug("Starting to get all users.");

        try {
            try {
                List<Person> users = em.createQuery("SELECT u FROM Person u").getResultList();
                logger.info("Success, got all users.");
                return new ArrayList<Person>(users);
            }
            catch(PersistenceException e)
            {
                if(e.getCause().getCause().getMessage().contains("ERROR: relation \"users\" does not exist"))
                {
                    logger.info("No users in the database.");
                }
                else
                {
                    logger.error("Error while getting users from the database, error: ", e);
                }
            }
        }catch(Exception e)
        {
            logger.error("Cant get the users, error: ",e);
        }
        return null;
    }

Источник данных из standalone-full.xml:

  <subsystem xmlns="urn:jboss:domain:datasources:5.0">
        <datasources>
            <datasource jndi-name="java:jboss/datasources/swap" pool-name="swap" enabled="true" use-java-context="true">
                <connection-url>jdbc:postgresql://127.0.0.1:5432/swap?useUnicode=yes&amp;characterEncoding=UTF-8</connection-url>
                <driver>org.postgresql</driver>
                <security>
                    <user-name>postgres</user-name>
                    <password>postgres</password>
                </security>
            </datasource>
            <drivers>
                <driver name="org.postgresql" module="org.postgresql">
                    <driver-class>org.postgresql.Driver</driver-class>
                    <xa-datasource-class>org.postgresql.Driver</xa-datasource-class>
                </driver>
            </drivers>
        </datasources>
    </subsystem>

1 Ответ

0 голосов
/ 29 ноября 2018

Следующие строки выглядят подозрительно:

@EJB
PersonService personService = new PersonService();

Он должен быть либо внедрен (поэтому = new PersonService(); не требуется), либо создан через конструктор, но этот экземпляр не управляется каким-либо контейнером и, как следствие,впрыска там не происходит, и EntityManager em остается null.

Пожалуйста, обновите ваш код следующим образом:

@EJB
PersonService personService;

Кроме того, Интеграция JAX-RS с технологией EJB и CDIВ разделе учебника по JavaEE 6 предполагается, что ресурсы JAX-RS должны быть либо самими EJB-компонентами (помеченными @Stateless или @Stateful), либо компонентами CDI (помеченными @ApplicationScoped или @RequestScoped).Я бы предложил добавить аннотацию @Stateless к самому классу PersonResource.

...