public void specifyCreditCard(String kontonr, String vorname, String name) throws ApplicationException {
try {
bp.specifyCreditCard(kontonr, vorname, name);
ApplicationExceptionInspector.checkForApplicationException();
} catch (ApplicationException ae) {
throw ae;
}
}
上面的方法在我的客户端模块端。它是bean管理的,我想从容器管理的EJB模块会话bean中调用methode specifyCreditCard。这是我的EJB模块方面的方法:
@Override
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public void specifyCreditCard(String kontonr, String name, String vorname) throws ApplicationException {
long gesamtkosten = 0;
for (Bestellposition bp : (ArrayList<Bestellposition>) bestellung.getPositionen()) {
gesamtkosten = gesamtkosten + (bp.getPreis() * bp.getAnzahl());
}
KreditkartenkontoDTO gesuchtesKonto = kb.getKreditkartenkonto(kontonr);
SimpleDateFormat dt = new SimpleDateFormat("yyyyy-mm-dd");
if (gesuchtesKonto == null) {
throw new ApplicationException("", "Eingabe der Kontonummer war fehlerhaft.");
} else {
if (!gesuchtesKonto.getInhaberName().equals(name)) {
throw new ApplicationException("", "Der Nachname stimmt nicht überein.");
}
if (!gesuchtesKonto.getInhaberVorname().equals(vorname)) {
throw new ApplicationException("", "Der Vorname stimmt nicht überein.");
}
if (!new Date().before(gesuchtesKonto.getAblaufDatum())) {
throw new ApplicationException("", "Konto ist ungültig.");
}
long belastung = gesuchtesKonto.getBelastung() + gesamtkosten;
if (belastung < gesuchtesKonto.getLimit()) {
gesuchtesKonto.setBelastung(belastung);
kb.updateBelastung(gesuchtesKonto);
} else {
throw new ApplicationException("", "Ihr Kontostand ist für diese Bestellung im Wert von " + gesamtkosten + " € zu niedrig.");
}
}
}
我遇到的问题是,当我输入无效的内容时,我的应用异常会被抛出。所以现在事务将被标记为回滚,我不能再次重复此方法,因为事务无效(javax.ejb.EJBException:javax.transaction.InvalidTransactionException)。
我该怎么办,输入错误后,我的交易没有标记为回滚?提前谢谢。
答案 0 :(得分:1)
有必要使用@ApplicationException批注创建自定义异常并抛出它而不是ApplicationException:
@ApplicationException(rollback=false)
public class MyApplicationException extends ApplicationException {
...
}
...
throw new MyApplicationException(); //does not rollback the transaction