Исключение сохраняемости Quarkus и исключение нулевого указателя Java

Класс конечной точки:

    @Path("/")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @Transactional
    @ApplicationScoped
    public class UserEndPoint {

        @Inject
        private UserRepository UserDao;

        @GET
        @Path("user")
        public List<Utilisateur> all() {
            return UserDao.findAllUsers();
        }

        @GET
        @Path("user/by-name")
        public List<Utilisateur> findByName(@PathParam String name, @PathParam String firstName) {
            return UserDao.findbyName(name, firstName);
        }

        @GET
        @Path("user/create-after")
        public List<Utilisateur> findCreateAfter(@PathParam Date date) {
            return UserDao.findByCreate_Date(date);
        }

        @GET
        @Path("User/{userId}")
        public Utilisateur findById(@PathParam Long id) {
            Utilisateur p = UserDao.findById(id);
            if (p == null)
                throw new WebApplicationException(Status.NOT_FOUND);
            return p;
        }

        @PUT
        @Path("User/{userId}")
        public void updateUser(@PathParam Long id, Utilisateur newUser) {
            Utilisateur p = UserDao.findById(id);
            if (p == null)
                throw new WebApplicationException(Status.NOT_FOUND);
            p.setBirth_date(newUser.getBirth_date());
            p.setFirtName(newUser.getFirtName());
            p.setLastname(newUser.getLastname());
        }

        @DELETE
        @Path("User/{userId}")
        public void deleteUser(@PathParam Long id) {
            Utilisateur p = UserDao.findById(id);
            if (p == null)
                throw new WebApplicationException(Status.NOT_FOUND);
            UserDao.delete(p);
        }

        @POST
        @Path("user")
        public Response newUser(@Context UriInfo uriInfo, Utilisateur newUser) {
            Utilisateur p = new Utilisateur();
            p.setBirth_date(newUser.getBirth_date());
            p.setFirtName(newUser.getFirtName());
            p.setLastname(newUser.getLastname());
            UserDao.persist(p);

            URI uri = uriInfo.getAbsolutePathBuilder().path(UserEndPoint.class).path(UserEndPoint.class, "findById")
                    .build(p.getUserId());
            return Response.created(uri).build();
        }

    }

Классы Дао:

    @ApplicationScoped
    public class UserRepository implements PanacheRepository<Utilisateur> {

        @Inject
        protected EntityManager entityManager;

        @Transactional
        public List<Utilisateur> findbyName(String lastname, String firstName) {

            List<Utilisateur> users = new ArrayList<>();
            try {
                users = entityManager.createQuery("FROM User WHERE lastName = :lastName and firstName", Utilisateur.class)
                        .setParameter("lastName", lastname).getResultList();

            } catch (Exception e) {
                // TODO: handle exception
            }
            return users;

        }

        @Transactional
        public List<Utilisateur> findByCreate_Date(Date date) {

            List<Utilisateur> users = new ArrayList<>();

            try {
                users = entityManager.createQuery("FROM User WHERE create_date> :date", Utilisateur.class)
                        .setParameter("date", date).getResultList();
            } catch (Exception e) {
                // TODO: handle exception
            }
            return users;
        }

        @Transactional
        public void persist(Utilisateur person) {
            try {
                entityManager.persist(person);
            } catch (Exception e) {
                // TODO: handle exception
            }
        }

        @Transactional
        public void delete(Utilisateur person) {
            try {
                entityManager.remove(person);
            } catch (Exception e) {
                // TODO: handle exception
            }
        }

        @Transactional
        public Utilisateur findByUserId(Long id) {
            Utilisateur userid = null;
            try {
                userid = entityManager.find(Utilisateur.class, id);
            } catch (Exception e) {
                // TODO: handle exception
            }
            return userid;
        }

        @Transactional
        public List<Utilisateur> findAllUsers() {
            List<Utilisateur> users = new ArrayList<Utilisateur>();
            try {
                users = entityManager.createQuery("FROM User", Utilisateur.class).getResultList();
            } catch (Exception e) {
                // TODO: handle exception
            }
            return users;
        }

    }

Класс сущности:

    @Slf4j
    @Data
    @Entity
    @Table(name = "Utilisateur")
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    @DiscriminatorValue("P_")
    @RegisterForReflection
    public class Utilisateur extends PanacheEntity implements Serializable {

        /**
         * 
         */
        private static final long serialVersionUID = 461991388948874292L;

        // ------------------------proprieties----------------------------------------
        Date date = null;
        protected static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "USER_ID")
        protected Long userId;

        @NotNull
        @Size(min = 3, max = 50)
        @Column(name = "firstName", length = 50)
        protected String firtName;

        @NotNull
        @Size(min = 3, max = 50)
        @Column(name = "lastName", length = 50)
        protected String lastname;

        @Column(name = "userName", length = 50)
        protected String userName;

        @Column(name = "login", length = 20)
        protected String login;

        @Column(name = "password", length = 50)
        protected String password;

        @Column(name = "email")
        private String email;

        @Column
        private String confirm_pass;

        @Column
        private Long group_id;

        @Column(name = "photo")
        protected String photo;

        @Column(name = "sex", length = 1)
        protected String sex;

        @Column(name = "nationality", length = 50)
        protected String nationality;

        @Column
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
        protected Date birth_date;

        @Column
        protected boolean authenticated;

        @Column
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy HH:mm a z")
        protected Date create_date;

        @Column
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy HH:mm a z")
        protected Date modify_date;

        @OneToMany(fetch = FetchType.EAGER, mappedBy = "user", cascade = CascadeType.ALL)
        private List<UserRole> roles;

        @Embedded
        @AttributeOverrides({

                @AttributeOverride(name = "phone", column = @Column(name = "P_phone", nullable = false, updatable = true)),
                @AttributeOverride(name = "homePhone", column = @Column(name = "P_homePhone", nullable = false, updatable = true)),
                @AttributeOverride(name = "country", column = @Column(name = "P_country", nullable = false, updatable = true)),
                @AttributeOverride(name = "city", column = @Column(name = "P_city", nullable = false, updatable = true)),
                @AttributeOverride(name = "street", column = @Column(name = "P_street", nullable = false, updatable = true)),
                @AttributeOverride(name = "zipCode", column = @Column(name = "P_zipCode", nullable = false, updatable = true)) })
        Adress adress;

        public Long getUserId() {
            return userId;
        }

        public void setUserId(Long userId) {
            this.userId = userId;
        }

        public String getFirtName() {
            return firtName;
        }

        public void setFirtName(String firtName) {
            this.firtName = firtName;
        }

        public String getLastname() {
            return lastname;
        }

        public void setLastname(String lastname) {
            this.lastname = lastname;
        }

        public String getLogin() {
            return login;
        }

        public void setLogin(String login) {
            this.login = login;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public String getPhoto() {
            return photo;
        }

        public void setPhoto(String photo) {
            this.photo = photo;
        }

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

        public String getNationality() {
            return nationality;
        }

        public void setNationality(String nationality) {
            this.nationality = nationality;
        }

        public Date getBirth_date() {
            return birth_date;
        }

        public void setBirth_date(Date birth_date) {
            simpleDateFormat.format(birth_date);
            this.birth_date = birth_date;
        }

        public boolean isAuthenticated() {
            return authenticated;
        }

        public void setAuthenticated(boolean authenticated) {
            this.authenticated = authenticated;
        }

        public Date getCreate_date() {
            return create_date;
        }

        public void setCreate_date(Date date) {

            simpleDateFormat.format(date);
            this.create_date = date;
        }

        public Date getModify_date() {
            return modify_date;
        }

        public void setModify_date(Date modify_date) {
            simpleDateFormat.format(modify_date);
            this.modify_date = modify_date;
        }

        public Adress getAdress() {
            return adress;
        }

        public void setAdress(Adress adress) {
            this.adress = adress;
        }

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        public List<UserRole> getRoles() {
            return roles;
        }

        public void setRoles(List<UserRole> roles) {
            this.roles = roles;
        }

        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        public String getConfirm_pass() {
            return confirm_pass;
        }

        public void setConfirm_pass(String confirm_pass) {
            this.confirm_pass = confirm_pass;
        }

        public Long getGroup_id() {
            return group_id;
        }

        public void setGroup_id(Long group_id) {
            this.group_id = group_id;
        }

        public Utilisateur() {
            super();

        }

        public Utilisateur(String userName) {
            super();
            this.userName = userName;
        }

        public Utilisateur(String userName, String password) {
            super();
            this.userName = userName;
            this.password = password;
        }

        public Utilisateur(@NotNull @Size(min = 3, max = 50) String firtName,
                @NotNull @Size(min = 3, max = 50) String lastname, String userName, String login, String password,
                String email, String confirm_pass, Long group_id, String photo, String sex, String nationality,
                Date birth_date, boolean authenticated, Date create_date, Date modify_date, List<UserRole> roles,
                Adress adress) {
            super();
            this.firtName = firtName;
            this.lastname = lastname;
            this.userName = userName;
            this.login = login;
            this.password = password;
            this.email = email;
            this.confirm_pass = confirm_pass;
            this.group_id = group_id;
            this.photo = photo;
            this.sex = sex;
            this.nationality = nationality;
            this.birth_date = birth_date;
            this.authenticated = authenticated;
            this.create_date = create_date;
            this.modify_date = modify_date;
            this.roles = roles;
            this.adress = adress;
        }

    }

Запускаю приложение в командной строке, получаю исключение:

javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
        at io.quarkus.hibernate.orm.runtime.boot.FastBootEntityManagerFactoryBuilder.persistenceException(FastBootEntityManagerFactoryBuilder.java:113)
        at io.quarkus.hibernate.orm.runtime.boot.FastBootEntityManagerFactoryBuilder.build(FastBootEntityManagerFactoryBuilder.java:67)
        at io.quarkus.hibernate.orm.runtime.FastBootHibernatePersistenceProvider.createEntityManagerFactory(FastBootHibernatePersistenceProvider.java:54)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
        at io.quarkus.hibernate.orm.runtime.JPAConfig$LazyPersistenceUnit.get(JPAConfig.java:109)
        at io.quarkus.hibernate.orm.runtime.JPAConfig.startAll(JPAConfig.java:57)
        at io.quarkus.hibernate.orm.runtime.HibernateOrmRecorder.startAllPersistenceUnits(HibernateOrmRecorder.java:77)
        at io.quarkus.deployment.steps.HibernateOrmProcessor$startPersistenceUnits37.deploy_0(HibernateOrmProcessor$startPersistenceUnits37.zig:70)
        at io.quarkus.deployment.steps.HibernateOrmProcessor$startPersistenceUnits37.deploy(HibernateOrmProcessor$startPersistenceUnits37.zig:36)
        at io.quarkus.runner.ApplicationImpl1.doStart(ApplicationImpl1.zig:145)
        at io.quarkus.runtime.Application.start(Application.java:94)
        at io.quarkus.runner.RuntimeRunner.run(RuntimeRunner.java:143)
        at io.quarkus.dev.DevModeMain.doStart(DevModeMain.java:180)
        at io.quarkus.dev.DevModeMain.start(DevModeMain.java:94)
        at io.quarkus.dev.DevModeMain.main(DevModeMain.java:66)
Caused by: java.lang.NullPointerException
        at org.hibernate.search.mapper.orm.mapping.impl.HibernateOrmMetatadaContributor.configure(HibernateOrmMetatadaContributor.java:59)
        at org.hibernate.search.mapper.pojo.mapping.spi.AbstractPojoMappingInitiator.configure(AbstractPojoMappingInitiator.java:89)
        at org.hibernate.search.mapper.orm.mapping.impl.HibernateOrmMappingInitiator.configure(HibernateOrmMappingInitiator.java:129)
        at org.hibernate.search.engine.common.impl.SearchIntegrationBuilderImpl$MappingBuildingState.collect(SearchIntegrationBuilderImpl.java:310)
        at org.hibernate.search.engine.common.impl.SearchIntegrationBuilderImpl.prepareBuild(SearchIntegrationBuilderImpl.java:192)
        at org.hibernate.search.mapper.orm.bootstrap.impl.HibernateOrmIntegrationBooterImpl.doBootFirstPhase(HibernateOrmIntegrationBooterImpl.java:249)
        at org.hibernate.search.mapper.orm.bootstrap.impl.HibernateOrmIntegrationBooterImpl.bootNow(HibernateOrmIntegrationBooterImpl.java:194)
        at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:616)
        at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:591)
        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488)
        at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1975)
        at org.hibernate.search.mapper.orm.bootstrap.impl.HibernateSearchSessionFactoryObserver.sessionFactoryCreated(HibernateSearchSessionFactoryObserver.java:41)
        at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35)
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:389)
        at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:462)
        at io.quarkus.hibernate.orm.runtime.boot.FastBootEntityManagerFactoryBuilder.build(FastBootEntityManagerFactoryBuilder.java:65)

Не могли бы вы помочь мне разрешить это исключение.


person Bankass    schedule 27.12.2019    source источник
comment
Добро пожаловать в SO! На этот раз я сделал это за вас, но в будущем форматируйте исключения так же, как вы это делали с кодом. Это делает чтение намного более терпимым. Наслаждаться!   -  person codeMagic    schedule 27.12.2019


Ответы (1)


Похоже, проблема в Hibernate Search, но ваша сущность не выглядит так, как будто она ее использует. Есть ли у вас объекты, использующие Hibernate Search? Вы пытаетесь инициализировать поиск Hibernate вместо того, чтобы позволить Quarkus сделать это? Вы использовали расширение Quarkus Hibernate Search + Elasticsearch? Потому что просто добавить зависимости Hibernate Search не получится: вам нужно использовать расширение.

NPE всегда является ошибкой, так как у вас должно быть по крайней мере более значимое исключение, если что-то не поддерживается. Итак, нам нужно разобраться в том, что создает эту неожиданную ситуацию.

В любом случае, вероятно, поможет публикация полного репродуктора (то есть самого маленького приложения, воспроизводящего проблему).

person Guillaume Smet    schedule 27.12.2019
comment
Да, я использую зависимости поиска в спящем режиме в pom.xml. Если я прокомментирую puis, мое приложение начнется успешно. Спасибо большое. - person Bankass; 28.12.2019
comment
Если вы хотите использовать Hibernate Search, вам нужно использовать расширение. См. Документацию здесь: quarkus.io/guides/hibernate-search-elasticsearch - person Guillaume Smet; 28.12.2019