@Around Aspect in Spring AOP抛出空指针异常

时间:2018-01-23 03:46:45

标签: spring spring-aop

有人可以帮我解决为什么我的@Around建议会抛出空指针异常。我确保我的建议返回一个与继续进行方法相同的Object,但我得到了异常。

@Aspect
public class BasicAuthAspect 
{

    @Around("execution(* *..impl.PreferenceImpl.*(..))") 
    public Object auth(ProceedingJoinPoint joinPoint) {
        log.debug("Inside Basic Auth check method..");
        ServletRequestAttributes requestAttributes=null;
        requestAttributes=(ServletRequestAttributes)
      RequestContextHolder.getRequestAttributes();
        if(requestAttributes!=null){
        request =requestAttributes.getRequest();

         Object[] signatureArgs = joinPoint.getArgs();
            try {
                return (Response) joinPoint.proceed(signatureArgs);
            } catch (Throwable e) {
                return Response.status(HttpStatus.SC_UNAUTHORIZED).build();
            }
    }

        }
        else{
            return Response.status(HttpStatus.SC_UNAUTHORIZED).build();
        }


      }

}

这是我要继续的方法(PreferenceImpl.java):

@Override
    public Response postPreferences( String preference) {


        String responseReturned=searchDAO.postPreference( XSSUtils.normalize(preference));
        if(responseReturned!=null)
        response=Response.status("success").build();
        else
        response=Response.status("failure").build();
        return response;    
        }

这里是错误日志:

java.lang.NullPointerException
    at java.lang.String.<init>(String.java:556)[:1.7.0_80]
    at org.apache.cxf.transport.http.AbstractHTTPDestination.getAuthorizationPolicyFromMessage(AbstractHTTPDestination.java:163)[173:org.apache.cxf.cxf-rt-transports-http:2.7.3]
    at org.apache.cxf.transport.http.AbstractHTTPDestination.setupMessage(AbstractHTTPDestination.java:349)[173:org.apache.cxf.cxf-rt-transports-http:2.7.3]
    at org.apache.cxf.transport.http.AbstractHTTPDestination.setupMessage(AbstractHTTPDestination.java:258)[173:org.apache.cxf.cxf-rt-transports-http:2.7.3]
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:345)[179:org.apache.cxf.cxf-rt-transports-http-jetty:2.7.3]
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:319)[179:org.apache.cxf.cxf-rt-transports-http-jetty:2.7.3]
    at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72)[179:org.apache.cxf.cxf-rt-transports-http-jetty:2.7.3]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1040)[79:org.eclipse.jetty.server:7.6.8.v20121106]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:976)[79:org.eclipse.jetty.server:7.6.8.v20121106]

1 个答案:

答案 0 :(得分:0)

你可能会遇到几个问题:

  • 您的切入点拦截所有PreferenceImpl方法,但似乎您只想抓住一个方法。我建议你使切入点更具体。

  • 您假设在advice方法中返回类型Response,但您的切入点假定*并且通知方法本身返回Object,因此理论上另一种方法可以返回另一种类型并且演员会失败(见第一个问题)。

  • 您正在尝试为proceed()提供参数,但这实际上并非必要。所以只需删除getArgs()内容,您就不需要它了。

如果我的提示仍有问题,请告诉我,我可以提供一些示例代码。顺便说一下,也许你想阅读一个基本的Spring AOP教程。 : - )