Java BMT EJB如何使用UserTransaction
我试图创建一个BMT EJB示例并手动控制事务,但当尝试运行时,我得到了一个NullException,我不知道我做错了什么。 代码如下:Java BMT EJB如何使用UserTransaction,java,transactions,jboss,ejb,jta,Java,Transactions,Jboss,Ejb,Jta,我试图创建一个BMT EJB示例并手动控制事务,但当尝试运行时,我得到了一个NullException,我不知道我做错了什么。 代码如下: @Stateless @TransactionManagement(TransactionManagementType.BEAN) @Local(GlobalTLocal.class) public class GlobalT implements GlobalTLocal { @Resource private UserTransaction utx
@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为我提交插入
我做错了什么
Tks如果使用的是主类,则必须使用启动,并且@Resource必须是主类中的静态字段,而不是创建的对象中的静态字段。但是,请注意,JavaEE平台规范不需要应用程序客户机容器来支持UserTransaction。如果JBoss在其应用程序客户端容器中不支持UserTransaction,那么您可以选择:
如果您使用的是主类,则必须使用启动,并且@Resource必须是主类中的静态字段,而不是您创建的对象中的静态字段。但是,请注意,JavaEE平台规范不需要应用程序客户机容器来支持UserTransaction。如果JBoss在其应用程序客户端容器中不支持UserTransaction,那么您可以选择:
我认为您应该避免使用@Resource在Bean级别(BMT无状态Bean)检索UserTransaction。相反,您可以使用以下方法获取对SessionContext的引用:
@Resource
SessionContext context
然后使用上下文引用检索业务方法内的当前UserTransaction
context.getUserTransaction();
我认为您应该避免使用@Resource在Bean级别(BMT无状态Bean)检索UserTransaction。相反,您可以使用以下方法获取对SessionContext的引用:
@Resource
SessionContext context
然后使用上下文引用检索业务方法内的当前UserTransaction
context.getUserTransaction();
堆栈跟踪中的行号与代码不匹配。第71行和第94行在做什么?看起来您正在使用JavaSE直接启动Principal类:这行不通;注入仅支持EE组件。您需要从JNDI中查找EJB,或者在应用程序客户机容器中使用注入。很抱歉,太晚了。第71行和第94行是“utx.begin();”和“utx.rollback();”。我正在按你说的那样下水。你能给我举个例子说明如何做你的建议吗?GlobalT类位于Jboss容器中的deploy文件夹中。Jboss联机后,我运行创建GlobalT实例的Principal类并调用sincroniza方法。堆栈跟踪中的行号与代码不匹配。第71行和第94行在做什么?看起来您正在使用JavaSE直接启动Principal类:这行不通;注入仅支持EE组件。您需要从JNDI中查找EJB,或者在应用程序客户机容器中使用注入。很抱歉,太晚了。第71行和第94行是“utx.begin();”和“utx.rollback();”。我正在按你说的那样下水。你能给我举个例子说明如何做你的建议吗?GlobalT类位于Jboss容器中的deploy文件夹中。Jboss联机后,我运行Principal类,该类创建GlobalT实例并调用sincroniza方法。