[Seasar-user:13843] [S2Unit] トランザクションが開始されない(seasar入門本)

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2008年 4月 21日 (月) 06:04:56 JST


いつもお世話になっております。

いまSeasar入門本 P.267のS2Unitのサンプルを試しているのですが、
 (トランザクションが開始しているか調べるTxBeanをテストする)

RequiredInterceptorTest#testInvoke()、
トランザクションを調べるところで、NullPointerExceptionが発生していまします。

デバッグでステップしていくと、
RequiredInterceptorTest(S2TestCase).doRunTest() 内の tm が nullになっていますが、
diconファイルの書き方が悪いのでしょうか?

どうぞアドバイスをよろしくお願い致します。

              chiitake.

◆環境:
seasar-extension-2.4.22
seasar-framework-2.4.22


◆RequiredInterceptorTest.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <include path="j2ee.dicon" />
    <component class="seasar2test1.dto.TxBeanImpl">
        <aspect>j2ee.requiredTx</aspect>
    </component>
</components>

◆エラー
java.lang.NullPointerException
    at org.seasar.extension.tx.RequiredInterceptor.invoke(RequiredInterceptor.java:41)
    at seasar2test1.dto.TxBeanImpl$$EnhancedByS2AOP$$1cac6db$$MethodInvocation$$hasTransaction0.
proceed(MethodInvocationClassGenerator.java)
    at seasar2test1.dto.TxBeanImpl$$EnhancedByS2AOP$$1cac6db.hasTransaction(TxBeanImpl$$
EnhancedByS2AOP$$1cac6db.java)
    at seasar2test1.dto.RequiredInterceptorTest.testInvoke(RequiredInterceptorTest.java:31)

2008-04-21 05:36:51,187 [main] DEBUG org.seasar.framework.container.factory.S2ContainerFactory - 
S2Containerを作成しました。path=seasar2test1/dto/RequiredInterceptorTest.dicon
2008-04-21 05:36:51,203 [main] WARN  org.seasar.framework.container.assembler.BindingTypeShouldDef - 
org.seasar.extension.tx.RequiredInterceptorのプロパティ(transactionControl)が見つからないので設定を
スキップします



◆TxBeanImpl.java
package seasar2test1.dto;

import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.TransactionManager;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class TxBeanImpl implements TxBean {
    private Log log = LogFactory.getLog(TxBeanImpl.class);
    
    private TransactionManager tm_;
    
    public TxBeanImpl(TransactionManager tm) {
        this.tm_ = tm;
    }
    
    public boolean hasTransaction() throws SystemException {
        if (tm_ == null) {
            throw new SystemException("tm_がnull!");
        }
        return tm_.getStatus() != Status.STATUS_NO_TRANSACTION;
    }

}

◆RequiredInterceptorTest.java
public class RequiredInterceptorTest extends S2TestCase {
    private Log log = LogFactory.getLog(RequiredInterceptorTest.class);

    private static final String PATH = "RequiredInterceptorTest.dicon";
    private TxBean txBean_;
    private TransactionManager tm_;
    
    public RequiredInterceptorTest(String name) {
        super(name);
    }
    
    // DIされているか。
    public void testCreate() {
        assertNotNull("1", txBean_);
        assertNotNull("2", tm_);
    }
    
    public void testInvoke() throws Exception {
        assertEquals("1", true, txBean_.hasTransaction());
        assertEquals("2", Status.STATUS_NO_TRANSACTION, tm_.getStatus() );
    }
    
    
    // setup
    protected void setUp() throws Exception {
        include(PATH);
    }
    
    // tearDown
    protected void tearDown() throws Exception {
        
    }
    
    public static Test suite() {
        return new TestSuite(RequiredInterceptorTest.class);
    }
    
    public static void main(String[] args) {
        junit.textui.TestRunner.main(
            new String[] { RequiredInterceptorTest.class.getName() }
        );
    }
}



Seasar-user メーリングリストの案内