TransactionManager#suspend()

またしても id:taedium さんとひがさんのやりとりから.昨年から taedium さんの日記はネタの宝庫でありがたい限りです.

If the thread is not associated with any transaction, a null object reference is returned; otherwise, a valid Transaction object is returned.

# higayasuo 『(中略) 3.2.3は、仕様がおかしいと思うんですよ。Transactionを開始してないのに、suspendするって。(以下略)』

別に仕様がおかしいというほどではないような.
妥当でない状況で呼び出された場合の振る舞いとして,例外をスローするのではなく null を返すようにと決められているだけですよね.例えば java.util.Collection#remove(Object) でコレクションに要素がなくても例外がスローされないのとあまり変わらないのではないかと.
このような仕様になっている理由は利便性でしょう.S2Tx にはサポートがありませんが,EJB 的な NotSupportedInterceptor を実装する場合...

    public Object invoke(final MethodInvocation invocation) throws Throwable {
        final Transaction tx = suspend();
        try {
            return invocation.proceed();
        }
        finally {
            if (tx != null) {
                resume(tx);
            }
        }
    }

というように,ノーチェックで TransactionManager#suspend() を呼び出しても大丈夫になります.まぁ,チェックしても大した手間ではありませんけど.実際 RequiresNewInterceptor はチェックしてますしね.
個人的には,ここは仕様通り実装すべきではないかなぁと思います.