当前位置: 首页 > 知识库问答 >
问题:

Spring AOP-实现Spring AOP时不调用的服务方法

王刚毅
2023-03-14

Aop配置已经在我的项目中完成。下面的配置已经为此添加。问题是,当以下代码未注释时,不调用formService中的方法。因此我得到空指针异常。你知道问题出在哪里吗?我已经附上了下面的代码..

AOP配置:

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.1.xsd ">

    <bean id="aspectClass" class="com.unknown.aspect.AspectClass"></bean>

    <aop:config>
        <aop:aspect id="aspectId" ref="aspectClass">
            <aop:pointcut id="abcPointcut" expression="execution(* com.unknown.pat.service.impl.patServiceImpl.generatePrefixByAccountUnit(..))"/>
            <aop:pointcut id="billServicePointcut" expression="execution(* com.unknown.bill.service.impl.billServiceImpl.saveAdvancePayment(..))"/>
            <aop:around pointcut-ref="abcPointcut" method="getPrefixLogAround"/>
            <aop:after-returning pointcut-ref="billServicePointcut" returning="result" method="sequenceUpdateAfterReturning"/>
            <aop:after-throwing pointcut-ref="billServicePointcut" throwing="error" method="sequenceUpdateAfterThrowing"/>
        </aop:aspect>
    </aop:config>

</beans>
<bean id="formService" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
        <value>
            com.radaptive.rdpv.runtime.service.FormService
        </value>
    </property>
    <property name="target">
        <ref bean="formManager" />
    </property>
</bean>



<bean id="formManager" parent="txProxyTemplate">
    <property name="target">
        <bean class="com.radaptive.rdpv.runtime.service.impl.FormServiceImpl">
            <property name="services">
                <ref bean="services" />
            </property>
            <property name="messageResource">
                <ref bean="logResourceForService" />
            </property>

        </bean>
    </property>

    <property name="transactionAttributes">
        <props>

            <prop key="updateForm">
            </prop>
        </props>
    </property>
</bean>
public class AspectClass {

    public void sequenceUpdateAfterReturning(JoinPoint joinPoint, Object result) throws RttException {
        WebApplicationContext ctx = (WebApplicationContext) RadaptiveApplicationCache.getInstance().getAttribute("SPRING_CONTEXT");
        Pat patientService = (Pat) ctx.getBean("pat");
        patientService.updatePrefixStatus("Success");
    }


    public void sequenceUpdateAfterThrowing(JoinPoint joinPoint, Throwable error) throws RttException {
        WebApplicationContext ctx = (WebApplicationContext) XXXApplicationCache.getInstance().getAttribute("SPRING_CONTEXT");
        Pat patientService = (Pat) ctx.getBean("pat");
        patientService.updatePrefixStatus("Failed");
    }

    public String getPrefixLogAround(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] paramValues = joinPoint.getArgs();
        String prefixStatus = String.valueOf(PrefixStatus.Reserved.getValue());
        //Get prefix method,waiting for till prefix status is reserved
        long startTime = System.currentTimeMillis();
        while(prefixStatus.equals(String.valueOf(PrefixStatus.Reserved.getValue()))){
            WebApplicationContext ctx = (WebApplicationContext) XXXApplicationCache.getInstance().getAttribute("SPRING_CONTEXT");
            Pat pat = (Pat) ctx.getBean("pat");
            prefixStatus = pat.getPrefixAvailability(paramValues[0].toString(),paramValues[1].toString(),paramValues[2].toString(), paramValues[4].toString());

            if(!prefixStatus.equals(String.valueOf(PrefixStatus.Reserved.getValue()))){
                Object retVal = joinPoint.proceed();
                prefixStatus = retVal.toString();
                break;
            }
        }
        return prefixStatus;
    }
}
    public String saveForm() throws RException  {
        try {
            entityMap = ((FormService) services.get("formManager")).createForm(metaform.getFormName(), entityMap, userPrincipal, triggerContext);
return SUCCESS_INCLUDE_DATA;
        } catch (Exception e) {

        }
    }

    public final Map<String,Object> createForm(final String formName, final Map values,
            final UserPrincipal userPrincipal, TriggerContext triggerContext) throws Exception {
        System.out.println("========== FORM SERVICE ENTER =======");
        return formmap;
    }

共有1个答案

程招
2023-03-14

你的方面是罪魁祸首,它有效地破坏了调用。您没有调用procede(),也没有将调用的结果返回给调用者。因此,您的方法从未被调用,现在实际上总是返回null

你的方法应该是这样的。

public Object getPrefixLogAround(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("====333");
    return joinPoint.proceed();
}
 类似资料:
  • Java+Spring+Maven应用程序: 有人能给我提供链接或者建议我一个纯AspectJ实现,不使用基于代理的Spring AOP吗? 如果我试图从同一中的访问,则不支持此操作。 我想知道:1)如何用切入点编写一个支持类内方法调用的aspectj?2)如何将其配置到我当前的Spring,maven项目中,使用aspectj加载时编织?3)如何配置aspectj maven插件,以便在Tomc

  • 主要内容:读者,前提条件,Spring AOP 概述Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。 读者 本教程主要是为Spring 面向方面编程(AOP)初学者准备的,帮助他们了解与Spring的AOP框架相关的基础到高级概念。 前提条件 在开始练习本教程系列文章中给出的各种类型的示例之前,我们假设您已经了解

  • 一些日志记录需要在类的静态方法执行前后完成。我试图使用Spring AOP实现这一点,但它不起作用,对于普通方法来说,它是起作用的。请帮助我理解如何实现这一点,如果可以使用注释来完成,那就太好了。

  • 我有一个自定义注释, 我正在将这个注释用于以下方法, 我在以下方面捕捉事件, @Around建议仅适用于“进程连接点”参数。如果将 XAudit 作为第二个参数传递,则会引发以下错误: 我需要在方面中使用xaud才能访问Xaud的操作。请分享一些关于如何在@周围方面中访问@Xaud值的指针。

  • 本文向大家介绍SpringAOP中的注解配置详解,包括了SpringAOP中的注解配置详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了SpringAOP中的注解配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用注解实现SpringAOP的功能: 例子: xml配置:注意给例子中使用的其他的类上面也使用注解 注意:<aop

  • 我想在优雅的关闭上做一些工作。 我尝试了如下所示的方法,但它不起作用。 我找到了一个解决方法(在ContextClosedEvent的@EventListener标记方法上放置方面注释),但我想了解它失败的原因(方法没有任何异常根本没有调用)。 就我对Spring 5的研究而言,我发现@PreDestroy由CommonAnnotationBeanPostProcessor处理,而@Aspect类