0

私はかなり奇妙な問題に直面しています。私は自分のアプリでアノテーション駆動型のAspectJを使用しています。メソッドを続行しようとすると、自動配線されたフィールドにnullポインターが表示されます。(サービスクラスでは、インターセプターでどのメソッドを呼び出していますか)。AspectJを使用する前は、Springコンテキストは問題なく機能していました。私は自分のコードを提供しています、多分私はその小さな間違いを見ないでしょう:(それを見つけるのにあまりにも多くの時間を費やしました。:(

Aspectクラスは次のとおりです。

@Aspect
@Component
public class SomeInterceptor{

private static final Logger LOGGER = LoggerFactory.getLogger(SomeInterceptor.class);

@Autowired
@Qualifier("webServiceResponseFactory")
protected WebServiceResponseFactory responseFactory;

@Autowired
@Qualifier("configBean")
protected ConfigBean configBean;

public SomeServiceInterceptor () {
    LOGGER.info("Some service interceptor was created");
}

@Around("execution(public * pathToMyClassIsCorrect.*(..))")
public Object invoke(ProceedingJoinPoint pjp) throws Throwable {
    String securityTokenForMethod = pjp.getArgs()[0].toString();
    if (securityTokenForMethod != null) {
        LOGGER.info("Proceeding the securityTokenCheck before calling method "
                + pjp.getSignature().getName());
        if (validateAccessToken(securityTokenForMethod)) {
            return responseFactory
                    .buildFailedResponse("securityAccessToken is invalid for this request");
        }
    } else {
        throw new Throwable("There was an exception before calling method "
                + pjp.getSignature().getName());
    }

    try {
        LOGGER.info("Calling method " + pjp.getSignature().getName());
        Object methodToInvoke = pjp.proceed();
        LOGGER.info("Method " + pjp.getSignature().getName()
                + " was called successfully");
        return methodToInvoke;
    } catch (Throwable e) {
        LOGGER.info("Method " + pjp.getSignature().getName() + "threw an exception. ");
        boolean verboseError = Boolean.parseBoolean(pjp.getArgs()[1].toString());

        return responseFactory.buildErrorResponse(e, verboseError);
    }
}

}

私のapp-context.xmlには、すべてのコンポーネントスキャンパッケージが含まれており、有効になっています。

どんな助けでも大歓迎です。

編集

また、呼び出しの直後に、次のようなエラーが発生します。

SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container

編集2.0:

アスペクトなしでサービスを起動しようとしただけで、正常に動作します。したがって、問題は実際にはサービスの方法を傍受する側面によって引き起こされます。:\

編集3.0:

コンストラクターにロガーを追加しました。したがって、私が見るように、オブジェクトは作成されていません。何が理由なのか分かりません。

編集4.0:AspectJ構成ファイル:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE aspectj PUBLIC
    "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<weaver options="-verbose -showWeaveInfo -debug">
    <!-- only weave classes in our application-specific packages -->
    <include within="com.store.*"/>
    <include within="com.store.services.*"/>
</weaver>
<aspects>
    <!-- weave in just this aspect -->
    <aspect name="com.store.services.StoreServiceAspect"/>
</aspects>
</aspectj>

<weaver options="-verbose">
<include within="javax.*" />
<include within="org.aspectj.*" />
<include
    within="(!@NoWeave com.store.services.*) AND com.bsro.storewebsrv.services.*" />

<dump within="com.store.services.*" />
</weaver>
4

3 に答える 3

1

エラー処理コードは危険なほど脆弱です。

LOGGER.info("Method " + pjp.getSignature().getName() + "threw an exception. ");
boolean verboseError = Boolean.parseBoolean(pjp.getArgs()[1].toString());

キャッチしたばかりの例外をマスクする新しい例外の機会はたくさんあります。例外ハンドラーを防弾にします。nullの可能性のある値でメソッドを呼び出して、何も解析したり、NPEにさらしたりしないでください。

于 2013-01-15T10:46:37.870 に答える
1

私はこれをあなたの最後のコメントに基づいています、これはAspectJの側面です。

@AutowiredAspectJアスペクトでは機能しません。修正は、ファクトリメソッドを使用して、aspectOf次のようにアスペクトに必要なものを注入することです。

<bean class="SomeInterceptor" factory-method="aspectOf">
  <property name="webServiceResponseFactory" ref="..."/>
</bean>
于 2013-01-15T11:07:25.817 に答える
0

解決策を見つけました。問題は、Tomcatのアプリコンテキストに「ローダー」がないためにltwが機能していなかったことです。したがって、Springの8.8.3リファレンスガイドに従って、ほぼ修正しました。上記の理由により、「aspectOf」は見つかりませんでした。このエラーは、織りが失敗するたびにスローされます。また、織りエラーのため、自動配線フィールドはnullになりました。

于 2013-01-16T11:14:25.513 に答える