Java Spring框架MVC中AOP的实现

Java Spring框架MVC中AOP的实现,java,spring,spring-mvc,spring-aop,Java,Spring,Spring Mvc,Spring Aop,我正在尝试用实现一个API。在我的应用程序中使用AOP Aspect时,我的编码出错了。我需要检查源代码的每个请求中的authToken,这样我就可以授予授权,还需要它来记录日志 在我的代码中,有几个自定义异常类继承自另一个主自定义异常类,它是从exception扩展而来的。当抛出自定义异常时,我需要等待异常的方法在我的方面类中工作,以便我可以返回适当的错误JSON响应 然而,在我的代码中,这两种等待异常的方法都有效,我想知道我是否以正确的方式编写了异常类。还有一件事,我不知道如何判断我的方面类

我正在尝试用实现一个API。在我的应用程序中使用
AOP Aspect
时,我的编码出错了。我需要检查源代码的每个请求中的
authToken
,这样我就可以授予授权,还需要它来记录日志

在我的代码中,有几个
自定义异常类
继承自另一个主
自定义异常类
,它是从exception扩展而来的。当抛出自定义异常时,我需要等待异常的方法在我的方面类中工作,以便我可以返回适当的错误JSON响应

然而,在我的代码中,这两种等待异常的方法都有效,我想知道我是否以正确的方式编写了异常类。还有一件事,我不知道如何判断我的方面类不适用于我定义的某些操作

这是我的代码:

@Aspect
public class SowLoggerAOP {

    protected Logger logger = Logger.getLogger("SowLoggerAOP");
    @Autowired(required = true)
    private HttpServletRequest request;
    @Resource(name = "personService")
    private PersonService personService;

    @Pointcut("execution(* sow.webservice.controllers..*.*(..))")
    private void selectAll(){}

    @Before("execution( * sow.webservice.controllers.PersonController.*(..))")
    public void logBeforeReq(JoinPoint jp) throws Exception{
        String personId = request.getParameter(Consts.AUTH_TOKEN);
        if (personService.isUserValid(personId)) {
            logger.debug("Spring AOP! Before invocation SUCCESFULL!!!: ");
        }
        else {
            logger.error("Person not found for the " + Consts.AUTH_TOKEN + " : " + personId);
            throw new PersonNotFoundException(
                "Person not found for the " + Consts.AUTH_TOKEN + " : " + personId,
                ErrorCodes.PERSON_NOT_FOUND);
        }
    }

    @AfterThrowing(pointcut = "selectAll()", throwing = "sowEx")
    public SowResult throwingSowException(SowCustomException sowEx){
        int errorCode = ErrorCodes.GENERAL_SYSTEM_ERROR;
        if(sowEx.getErrorCode() != 0)
            errorCode = sowEx.getErrorCode();
        SowResult result = new SowResult(Consts.SOW_RESULT_ERROR,
                                         errorCode,
                                         sowEx.getMessage(),
                                         "islem hata almistir!!");

        System.out.println("There has been an exception: " + sowEx.toString());
        return result;
    }

    @AfterThrowing(pointcut = "selectAll()", throwing = "ex")
    public void throwingJavaException(Exception ex){
        System.out.println("JAVA EXCEPTION IS THROWN :");
    }
}

public class SowCustomException extends Exception{

    private int errorCode;

    public SowCustomException(){
        super();
    }

    public SowCustomException(String errMsg){
        super(errMsg);
    }
    public SowCustomException(String errMsg, int errorCode){
        super(errMsg);
        this.errorCode = errorCode;
    }

    public SowCustomException(int errorCode){
        super();
        this.errorCode = errorCode;
    }

    public int getErrorCode() {
        return errorCode;
    }
    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }
}
public class PersonNotFoundException extends SowCustomException{

    public PersonNotFoundException(){
        super();
    }

    public PersonNotFoundException(String errMsg){
        super(errMsg);
    }

    public PersonNotFoundException(String errMsg, int errorCode){
        super(errMsg);
        super.setErrorCode(errorCode);
    }

    public PersonNotFoundException(int errorCode){
        super();
        super.setErrorCode(errorCode);
    }
}
public class SowResult {

    public int resultCode; // 1- Succesfull, 0- Fail
    public int errorCode;
    public String errorString;
    public String message;
    public Date date;
    public SowResult(int resultCode, int errorCode, String errorString,
            String message) {
        this.resultCode = resultCode;
        this.errorCode = errorCode; // 0 - No Error
        this.errorString = errorString;
        this.message = message;
        this.date = new Date();
    }
}
必须从该类创建预期的JSON:

@Aspect
public class SowLoggerAOP {

    protected Logger logger = Logger.getLogger("SowLoggerAOP");
    @Autowired(required = true)
    private HttpServletRequest request;
    @Resource(name = "personService")
    private PersonService personService;

    @Pointcut("execution(* sow.webservice.controllers..*.*(..))")
    private void selectAll(){}

    @Before("execution( * sow.webservice.controllers.PersonController.*(..))")
    public void logBeforeReq(JoinPoint jp) throws Exception{
        String personId = request.getParameter(Consts.AUTH_TOKEN);
        if (personService.isUserValid(personId)) {
            logger.debug("Spring AOP! Before invocation SUCCESFULL!!!: ");
        }
        else {
            logger.error("Person not found for the " + Consts.AUTH_TOKEN + " : " + personId);
            throw new PersonNotFoundException(
                "Person not found for the " + Consts.AUTH_TOKEN + " : " + personId,
                ErrorCodes.PERSON_NOT_FOUND);
        }
    }

    @AfterThrowing(pointcut = "selectAll()", throwing = "sowEx")
    public SowResult throwingSowException(SowCustomException sowEx){
        int errorCode = ErrorCodes.GENERAL_SYSTEM_ERROR;
        if(sowEx.getErrorCode() != 0)
            errorCode = sowEx.getErrorCode();
        SowResult result = new SowResult(Consts.SOW_RESULT_ERROR,
                                         errorCode,
                                         sowEx.getMessage(),
                                         "islem hata almistir!!");

        System.out.println("There has been an exception: " + sowEx.toString());
        return result;
    }

    @AfterThrowing(pointcut = "selectAll()", throwing = "ex")
    public void throwingJavaException(Exception ex){
        System.out.println("JAVA EXCEPTION IS THROWN :");
    }
}

public class SowCustomException extends Exception{

    private int errorCode;

    public SowCustomException(){
        super();
    }

    public SowCustomException(String errMsg){
        super(errMsg);
    }
    public SowCustomException(String errMsg, int errorCode){
        super(errMsg);
        this.errorCode = errorCode;
    }

    public SowCustomException(int errorCode){
        super();
        this.errorCode = errorCode;
    }

    public int getErrorCode() {
        return errorCode;
    }
    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }
}
public class PersonNotFoundException extends SowCustomException{

    public PersonNotFoundException(){
        super();
    }

    public PersonNotFoundException(String errMsg){
        super(errMsg);
    }

    public PersonNotFoundException(String errMsg, int errorCode){
        super(errMsg);
        super.setErrorCode(errorCode);
    }

    public PersonNotFoundException(int errorCode){
        super();
        super.setErrorCode(errorCode);
    }
}
public class SowResult {

    public int resultCode; // 1- Succesfull, 0- Fail
    public int errorCode;
    public String errorString;
    public String message;
    public Date date;
    public SowResult(int resultCode, int errorCode, String errorString,
            String message) {
        this.resultCode = resultCode;
        this.errorCode = errorCode; // 0 - No Error
        this.errorString = errorString;
        this.message = message;
        this.date = new Date();
    }
}

不幸的是,Spring的AOP堆栈忽略了
@posthrowing
通知方法的任何返回值。它只是执行它,然后继续抛出最初抛出的异常


您可能需要使用
@Around
建议,将
继续
调用包装在
try catch
块中,生成
SowResult
并返回它。

正如Sotirios Delimanolis所说,如果您想在拦截引发异常的方法后返回某个内容,您应该使用
@Around
。类似这样(我相信你的切入点是正确的):


你还没有告诉我们什么是或不是工作与此代码抱歉!我在这里添加了一些关于我需要什么的额外信息我照你说的做了。实现@Around注释的方法应该返回什么?因为它现在返回此异常:严重:路径为[/sow]的上下文中Servlet[spring]的Servlet.service()抛出异常[请求处理失败;嵌套异常为java.lang.ClassCastException:shoponway.webservice.common.SowResult无法转换为具有根的java.util.List]cause@EmillaAOP不是魔法。如果您的方法要返回一个
列表
(这就是您分配调用的对象),那么这就是您的方法应该返回的内容(即使是通过AOP反射)。你试图让它返回一个
SowResult
。是的,我知道了。那么,据我所知,spring并没有为我提供解决方案。因为我可能有很多操作,其中一些可能返回List对象,一些返回对象,一些甚至只返回一个字符串。那么,我如何定制一个方法来处理我的异常并返回一个适当的错误json(在我的情况下是SOWSULT obj)。也许我想错了,那么请澄清我@艾米拉,你认为结果会怎样?你就不能写一个
@ExceptionHandler
?让我简单地解释一下我需要什么。我有几个自定义异常,它有一个名为errorCode的属性,并且我的属性文件中有与这些错误代码匹配的错误消息。所以,如果抛出自定义异常,我需要捕获它并以json格式返回错误代码和错误消息。Spring用@RequestBody为我做了这件事。如果抛出了一个意外的异常,我需要再次捕获它,并再次返回一个带有SowResult的常规系统错误。