2

nullエンティティ パッケージのセッター メソッドの文字列引数で空の文字列をチェックし、それらを値に置き換えるアスペクトを開発しています。しかし、残念ながら私のアスペクトはうまく機能しません:(。私のポイントカット定義が原因だと思いますが、よくわかりません。

私の側面は次のようになります。

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class EmptyStringToNullSetter {
    private static final Logger LOGGER = LoggerFactory
            .getLogger(EmptyStringToNullSetter.class);

    public void check(final JoinPoint jp) {
        LOGGER.debug(jp.getSignature().toLongString());
    }
}

私の春の設定は次のようになります:

<bean id="emptyStringToNullSetter" class="de.foo.util.aop.parameter.EmptyStringToNullSetter" />
<aop:config>
    <aop:pointcut id="entityStringSetter" expression="execution(* de.foo.entity.*.set*(..)) and args(java.lang.String)" />
    <aop:aspect id="checkEmptyStringsAspect" ref="emptyStringToNullSetter">
        <aop:before method="check" pointcut-ref="entityStringSetter" />
    </aop:aspect>
</aop:config>

私のテストクラスは次のようになります:

import de.foo.entity.Period;

@ContextConfiguration(locations = { "/spring/test-util-context.xml" })
public class EmptyStringToNullSetterTest extends
    AbstractJUnit4SpringContextTests {
    @Test
    public void testCheck() {
        Period period = new Period();
        period.setName("");
        Assert.assertNull(period.getName());
    }
}

テストを実行すると、アスペクトはセッターをインターセプトしません。誰かが理由を知っていますか?!

乾杯、

ケビン

4

2 に答える 2

4

プロキシベースの AOP を使用しているため、アドバイスは Spring Bean にのみ適用され、「期間」オブジェクトは Bean ではありません。「ピリオド」を Bean として持つか、AspectJ のウィービング ベースの AOP を使用する必要があります。いずれの場合も、 before の代わりに around アドバイスを使用する必要があります。

于 2010-11-29T23:11:16.000 に答える
0

この設計は非常にトリッキーで、Spring JDK プロキシ ベースの AOP ではエラーが発生しやすくなります。

ここでこの点について言及しました:http://doanduyhai.wordpress.com/2011/08/08/spring-aop-advices-on-setters-not-trigged/

基本的に、Spring AOP で定義されたアスペクトは、元のターゲットをラップするプロキシ オブジェクトとして実行時に実装されます。

Bean のライフサイクルでは、Spring は、Bean が完全に初期化された後、たとえばセッターによるすべてのプロパティの注入後にのみプロキシを作成します。

そのため、セッターが初めて呼び出されたときに、プロキシがまだ存在しないため、アドバイスによってインターセプトされません。

ただし、setter への後続の呼び出しはすべて傍受されます。

さらに、別のターゲット メソッド内で setter() を呼び出すなど、自己呼び出しの問題にも注意してください。

于 2011-08-08T11:29:10.667 に答える