2012-02-07 69 views
0

我試圖manualy創建EJB BMT的例子和控制交易,但是當嘗試運行我得到了一個N​​ullException,我不硝酸鉀我在做什麼錯。 下面是代碼:BMT EJB如何使用UserTransaction的

@Stateless 
@TransactionManagement(TransactionManagementType.BEAN) 
@Local(GlobalTLocal.class) 
public class GlobalT implements GlobalTLocal { 

@Resource 
    private UserTransaction utx; 

public GlobalT() { 
} 

@Override 
public void sincroniza() { 



    Hashtable env = new Hashtable(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); 
    env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); 
    env.put(Context.PROVIDER_URL, "jnp://localhost:1099"); 
    Connection con = null; 
    Statement stmt = null; 
    ResultSet rs = null; 






    try { 


     String sqlPostgres = "SELECT * FROM RH.RHINFORMIX"; 
     String insert = "INSERT INTO RH.RHINFORMIX (id_agente,fk_codigo_area,nome,email,excluido,tipoinclusao,id,teste)"+ 
       " VALUES (11,11,'teste','teste',false,'I',12,'teste')"; 






     InitialContext ic = new InitialContext(env); 
     DataSource ds = (DataSource) ic.lookup("jdbc/RHMigracaoPostgres"); 





     con = ds.getConnection(); 

     utx.begin(); 

//   con.setAutoCommit(false); 

     stmt = con.createStatement(); 

     rs = stmt.executeQuery(sqlPostgres); 
     while (rs.next()) { 
      System.out.println("Query '" + sqlPostgres + "' returned " 
        + rs.getString(3)); 
     } 

     stmt.executeUpdate(insert); 

//   con.commit(); 


//   if(true){ 

    //    throw new Exception(); 
    //   } 

     utx.commit(); 
    } catch (Exception e) { 
     try { 
      utx.rollback(); 
     } catch (Exception e1) { 

      e1.printStackTrace(); 
     } 
     e.printStackTrace(); 
    } finally{ 
     if(rs != null) 
      try { 
       rs.close(); 
      } catch (SQLException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     if(stmt != null){ 
      try { 
       stmt.close(); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     if(con!=null){ 
      try { 
       con.close(); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 




} 

當我運行這個類我收到以下錯誤:

java.lang.NullPointerException 
at br.gov.dprf.GlobalT.sincroniza(GlobalT.java:94) 
at Principal.main(Principal.java:11) 
java.lang.NullPointerException 
at br.gov.dprf.GlobalT.sincroniza(GlobalT.java:71) 
at Principal.main(Principal.java:11) 

該EJB部署在一個JBoss 4.2.2發球和存在是JBoss期間沒有埃羅啓動,我們可以看到部署的EJB的日誌:

15:51:33,529 INFO [EJB3Deployer] Deployed: file:/C:/Jboss-Limpos/jboss-4.2.2.GA/server/all/deploy/GlobalTransaction.jar 

我試圖強制UserTransaction提交插入我!

我在做什麼錯?

韓國社交協會

+0

行號不匹配您的碼。 71和94行是幹什麼的?看起來你直接使用JavaSE啓動Principal類:這不起作用;只有EE組件支持注入。你需要從JNDI查找您的EJB或應用程序客戶端容器使用注射。 – 2012-02-07 23:26:37

+0

很抱歉。第71行和第94行是「utx.begin();」 和 「utx.rollback();」。我就像你說的那樣開始說話。你能給我舉例說明如何去做你的建議嗎? GlobalT類位於Jboss容器內的deploy文件夾中。在Jboss在線之後,我運行創建GlobalT實例的Principal類並調用sincroniza方法。 – IOSJR 2012-02-08 14:39:52

回答

0

如果您使用的是主類,則必須啓動使用application client container,和你的@Resource必須是一個靜態字段在主類,而不是創建一個對象。但是請注意,JavaEE平臺規範不要求應用程序客戶端容器支持UserTransaction。如果JBoss的不支持的UserTransaction在其應用程序客戶端容器,那麼你的選擇是:

  1. 使用在客戶端本地事務而忽略EE功能。換句話說,setAutoCommit(false),並寫入JDBC代碼以連接到數據庫,執行更新等。
  2. 將此邏輯移動到服務器,並使用遠程EJB,SOAP或某些客戶端從客戶端調用它其他RPC技術。
0

我相信你應該避免使用@Resource在Bean級別(BMT無狀態bean)檢索UserTransaction。相反,你可以使用獲得參考SessionContext:

@Resource 
SessionContext context 

然後使用上下文引用從堆棧跟蹤檢索當前UserTranaction業務方法裏面

context.getUserTransaction();