3

私はSpring AOPに本当に慣れていません。私のアプリケーションでは、メソッド パラメーターを HTTP メソッドに変換し、Spring がやなどHiddenHttpMethodFilterの他の HTTP メソッドを処理できるように構成しました。DELETEPUTGETPOST

特にマルチパート リクエストを処理する場合は、この機能を無効にする必要がある場合があります。特定のリクエストで(mulripartに関して)無効にするために、次のコードを使用していました。

package resolver;

import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartResolver;

/**
 * Disables the spring multipart resolver for specific client requests and
 * therefore keeps the request intact so that controllers can process it in
 * whatever way they wish. This behaviour is triggered by a particular GET
 * parameter in the client request so it is configurable.
 * @see MultipartResolver
 */
@Aspect
public final class MultipartResolverDisablingAspect
{
    /**
     * GET parameter which, if present in request, enables advice.
     */
    private static final String DISABLING_HTTP_REQUEST_PARAMETER_KEY = "_multipartResolverDisable";

    private static boolean disablingParameterExists(final HttpServletRequest request) 
    {
        Assert.notNull(request);
        return request.getParameter(DISABLING_HTTP_REQUEST_PARAMETER_KEY) != null;
    }

    /**
     * If above GET parameter exists in request then prompt the spring multipart
     * resolver to always tell spring that request is not of type multipart.
     * Spring then does not process the request any further.
     * @param pjp
     * @param request
     * @return
     * @throws Throwable
     */
    @Around("isMultipartOperation() && args(request)")
    public Object disableIsMultipartOperation(final ProceedingJoinPoint pjp, final HttpServletRequest request) throws Throwable 
    {

        Assert.notNull(pjp);
        Assert.notNull(request);

        if (disablingParameterExists(request)) 
        {
            return Boolean.FALSE;
        }

        return pjp.proceed();
    }

    /**
     * Applies to any implementation of {@linkplain MultipartResolver}
     */
    @SuppressWarnings("unused")
    @Pointcut("execution(public boolean " + "org.springframework.web.multipart.MultipartResolver." + "isMultipart(javax.servlet.http.HttpServletRequest))")
    private void isMultipartOperation() {}
}

ファイルにapplication-context.xmlは、次の xml が必要です。

<aop:aspectj-autoproxy proxy-target-class="false" />
<bean class="resolver.MultipartResolverDisablingAspect" /> <!--Registers the above bean (class)-->

このコードは、この記事のセクション - MULTIPART RESOLVER DISABLING ASPECT から抜粋したものです。

上記のコードで指定されているように、パラメーターがクエリ文字列として使用されるHiddenHttpMethodFilter場合にマルチパート処理を無効にすることを意図しており、通常どおり (クエリ文字列として指定された場合)コモンズ ファイルアップロードを使用できます。GETmultipartResolverDisable=1multipartResolverDisable=1


実際の質問はまだ画像に含まれていません。このアプローチは、以前は次の環境 (NetBeans 6.9.1 を使用) で正しく機能していました。

  • 春 3.2.0
  • サーブレット API 2.5 を使用する Apache Tomcat 6.0.26.6。

最近、NetBeans 7.2.1 を Servlet API 3.0 を持つ Apache Tomcat 7.0.35 にアップグレードしました。Spring バージョンは以前と同じで、 Spring 3.2.0 です。

今回の更新により、上記のアプローチにより次の例外が発生しました。

Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name
'org.springframework.transaction.config.internalTransactionAdvisor':
Cannot resolve reference to bean
'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0'
while setting bean property 'transactionAttributeSource'; nested
exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name
'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0':
Initialization of bean failed; nested exception is
**java.lang.IllegalArgumentException: error at ::0 can't find referenced
pointcut isMultipartOperation**

上記isMultipartOperation()のクラスの最後のメソッドです。

コードに小さな変更があるかもしれませんが、私は AOP についてほとんど知らないので、この見栄えの良いコードでこの例外の原因を突き止めることはできません。

この例外の原因は何ですか? サーブレット API で何かをする必要がありますか?

4

1 に答える 1

2

私はあなたがあなたの周りのアドバイスをに変えるべきだと思います

@Around("isMultipartOperation(..) && args(request)")

ポイントカット注釈を

@Pointcut("execution(* org.springframework.web.multipart.MultipartResolver.isMultipart(..)) && args(request)")

とポイントカット注釈付きメソッド

private void isMultipartOperation(HttpServletRequest request) {}

記憶から、私はいくつかのアドバイスでポイントカットをラップしようとしていたこの問題を抱えていました、そしてアドバイスはポイントカットに対して異なる数の議論を持っていました。コードでは、@ Aroundを使用してargs(request)でポイントカットをターゲットにしているように見えますが、ポイントカットメソッドにはそのようなパラメーターがありません。

于 2013-01-31T09:54:30.013 に答える