注:原因の特定に私が認めたいよりもはるかに多くの時間を費やした後、この質問を短い形式で回答とともに追加します。うまくいけば、私は他の誰かの痛みを救うでしょう。
EJB
で注釈が付けられたメソッド呼び出しを委任すると@Singleton
、コンテナは次の行に沿って例外をスローします。
TransactionRolledbackLocalException Client's transaction aborted
シングルトンBeanにはデータアクセスが発生していません。
ServiceBeanImpl.java
@Stateless
@Local
public class ServiceBean extends BaseBean{
@EJB private CacheService cacheService;
public FooObj getFooFromCache(int id) {
FooObj fooObj = (FooObj) cacheService.get(id);
if (fooObj == null) {
fooObj = getEntityById(FooObj.class, id);
cacheService.put(id, fooObj); //This throws exception
}
return cacheService.get(id);
}
}
CacheServiceImpl.java
@Singleton
@Startup
public class CacheServiceImpl implements CacheService {
private Cache cache;
@PostConstruct
public void init() {
CacheManager instance = CacheManager.getInstance();
cache = instance.getCache("cache");
}
@PreDestroy
public void destroy() {
CacheManager.getInstance().shutdown();
}
public Object get(Object id) {
return cache.get(id);
}
public void put(Object id, Object obj) {
return cache.put(id, obj);
}
}
質問 データアクセスを行わないシングルトンBeanを呼び出すと、トランザクション例外がスローされるのはなぜですか?