2016-02-07 106 views
0

在Java EE 7項目中我需要一個自定義的ConnectionProvider,它調用具有記錄UserId的DB-Function,並設置爲DB會話變量。注入自定義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(); 

This ca ll在其他Bean中工作,但不在MyappConnectionProvider中:-(

我在做什麼錯?

+0

基於這裏的錯誤,我猜你正試圖在容器加載前在這個數據庫中工作。在這種情況下不會工作,因爲你可能還沒有LoggedIn用戶......順便說一句,我錯過了這個評論,因爲你沒有回覆我的答案。 –

+0

是的,你是對的,那是我的錯誤。我已經解決了我的問題,具體的方式,我們如何訪問數據庫。您的解決方案絕對正確。非常感謝你。 – jin99