2015-04-16 2 views
1

Конфигурация AOP была выполнена в моем проекте. Ниже была добавлена ​​конфигурация. Проблема в том, что ниже кода в комментариях не используются методы в formService. Следовательно, я получаю исключение из null-указателя. Любая идея, где проблема? Я приложил код ниже ..Spring AOP - методы обслуживания, не вызываемые при внедрении весны 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> 

Применение-Контекст-service.xml, где formService бин сконфигурирован:

<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; 
    } 
} 

Проблема, возникшая в нижнем коде:

Всякий раз, когда я пытаюсь сохранить форму в своем приложении, служба формы не вызывается. В коде ниже, я назвал createForm метод Formservice но он возвращает нуль ..

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; 
    } 

СИС в CreateForm является не печатных и я ужасно смущен, почему этой весной АОП блокирует вызов метода formservice. Когда я прокомментирую, что aop:config, все работает нормально.

+0

Опубликовать свой аспект. Также вы не должны использовать «ProxyFactoryBean» или «TransactionalProxyFactoryBean», теперь вы смешиваете 2 разных прокси-стратегии, которые могут привести к прокси-серверу. –

+0

Пожалуйста, не добавляйте его в качестве комментария, не изменяйте свой пост. –

+0

Пожалуйста, оставляйте за кодом код !!!! Вы уничтожаете его каждый раз, когда редактируете свой пост ... –

ответ

4

Ваш аспект является виновником, он эффективно разрушает вызов. Вы не вызываете proceed() и не возвращаете результат этого вызова вызывающему. Следовательно, ваш метод никогда не вызывается, и вы теперь эффективно возвращаетесь null.

Ваш метод должен быть таким.

public Object getPrefixLogAround(ProceedingJoinPoint joinPoint) throws Throwable { 
    System.out.println("====333"); 
    return joinPoint.proceed(); 
} 
+0

Как я уже говорил, потому что вы сами уничтожаете вызов. При использовании советов по окружению вы должны вызывать 'continue()' else, чтобы фактический вызов метода не произошел. –

+0

Я удалил код в методах класса аспект. У него есть много строк под каждым методом. Тем не менее, я сохранил обновленный getPrefixLogAround самостоятельно .. Пожалуйста, посмотрите .. Спасибо .. :)) – karthick

+0

Опять же, пожалуйста, держите форматирование ... Вы отступаете все, чтобы текст стал частью блока кода, чего не должно быть! –