2016-02-07 2 views
0

в проекте Java EE 7 Мне нужен пользовательский ConnectionProvider, который вызывает функцию DB с зарегистрированным UserId и устанавливает переменные DB-Session.Injection in custom ConnectionProvider с CDI и Hibernate4

Моя проблема: я не могу ввести свой зарегистрированный пользователь в MyConnectionProvider, но во всех других компонентах - без проблем.

Это мой ConnectionProvider:

@SessionScoped 
@Named 
public class MyConnectionProvider implements ConnectionProvider, Configurable, Serializable { 

@Inject 
private Logger log; 

@Inject @LoggedIn 
private User currentUser = null; 

Вот класс Войти где инициализируется CurrentUser:

@SessionScoped 
@Named 
public class Login implements Serializable 
{ 

@Inject 
private Credentials credentials; 

@PersistenceContext 
private EntityManager userDatabase; 

private User currentUser; 

//..................................... 

@Produces 
@LoggedIn 
@Named 
@SessionScoped 
public User getCurrentUser() 
{ 
    return currentUser; 
} 

и интерфейс LoggedIn:

@Retention(RetentionPolicy.RUNTIME) 
@Target({TYPE, PARAMETER, METHOD, FIELD}) 
@Qualifier 
public @interface LoggedIn {} 

Может быть кто-нибудь имеет тот же Проблемы ?

ответ

0

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

Вы все еще можете получить такую ​​функциональность, просто используйте класс утилиты CDI для поиска своих ссылок. CDI.current().select(User.class, new LoggedInLiteral()).get() где User.class - класс ожидаемого типа, а LoggedInLiteral - это экземпляр квалификатора.

0

Большое спасибо за ваш ответ, Я попробовал ваше предложение, но я получаю ошибки при развертывании:

12:21:03,751 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 61) MSC000001: Failed to start service jboss.persistenceunit."myapp-ear.ear/myapp-ejb.jar#primary": org.jboss.msc.service.StartException in service jboss.persistenceunit."myapp-ear.ear/myapp-ejb.jar#primary": javax.persistence.PersistenceException: [PersistenceUnit: primary] Unable to build Hibernate SessionFactory 

at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:172) 
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:117) 

................. 
Caused by: java.lang.NullPointerException 
at org.jboss.weld.bean.builtin.BeanManagerProxy.<init>(BeanManagerProxy.java:74) 
at org.jboss.as.weld.WeldProvider$CdiImpl.getBeanManager(WeldProvider.java:95) 
at org.jboss.as.weld.WeldProvider$CdiImpl.getBeanManager(WeldProvider.java:73) 
at org.jboss.weld.AbstractCDI.getInstance(AbstractCDI.java:136) 
at org.jboss.weld.AbstractCDI.select(AbstractCDI.java:89) 
at de.testapp.myapp.persistance.MyappConnectionProvider.getConnection(MyappConnectionProvider.java:125) 


12:21:03,761 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "myapp-ear.ear")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.persistenceunit.\"myapp-ear.ear/myapp-ejb.jar#primary\"" => "org.jboss.msc.service.StartException in service jboss.persistenceunit.\"myapp-ear.ear/myapp-ejb.jar#primary\": javax.persistence.PersistenceException: [PersistenceUnit: primary] Unable to build Hibernate SessionFactory 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: primary] Unable to build Hibernate SessionFactory 
Caused by: java.lang.NullPointerException"}} 

и создать новый класс:

public class LoggedInLiteral extends AnnotationLiteral<LoggedIn> { 
    private static final long serialVersionUID = -5214077771963191949L; 
} 

и я вставил в MyappConnectionProvider in Methode getConnection():

currentUser = CDI.current().select(User.class, new LoggedInLiteral()).get(); 

Этот ca ll - работа в другом Bean, но не в MyappConnectionProvider :-(

Что я делаю неправильно?

+0

Основываясь на ошибке здесь, я предполагаю, что вы пытаетесь выполнить работу в этой БД до загрузки контейнера. Не буду работать в этом сценарии, так как у вас, вероятно, еще нет пользователя LoggedIn ... Кстати, я пропустил этот комментарий, так как вы не ответили на мой ответ. –

+0

Да, вы правы, это была моя ошибка. Я решил свою проблему, это был особый способ, как мы обращаемся к базе данных. Ваше решение было абсолютно правильным. Большое спасибо. – jin99

Смежные вопросы