如何重写jalo类中的方法?

2020-09-12 08:49发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我正在尝试在凭证扩展名下覆盖Voucher jalo的getDiscountValue方法。

即使我按照以下教程进行操作:

https://wiki.hybris.com/display/release4/Jalo+Layer

它不会在我新创建的jalo中运行代码。

重写Jalo类的正确方法是什么?

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我正在尝试在凭证扩展名下覆盖Voucher jalo的getDiscountValue方法。

即使我按照以下教程进行操作:

https://wiki.hybris.com/display/release4/Jalo+Layer

它不会在我新创建的jalo中运行代码。

重写Jalo类的正确方法是什么?

付费偷看设置
发送
8条回答
樱桃小丸子0093
1楼 · 2020-09-12 09:19.采纳回答

嗨Emre,
首先,您添加的链接来自版本4,除非您正在使用此版本,否则我建议您参考新版本:
https://wiki.hybris.com/display/release5/Jalo+Layer
然后是Jalo 层已弃用,并且使用起来不是很友好。 无法正确覆盖Voucher类的方法,但是您有两个选择:

  • 第一种可能性是创建在 -items.xml 中声明的您自己的类型,例如 MyVoucher ,从原始的 Voucher扩展到类型。 然后,在生成的 MyVoucher.java 类中,您应该实现新的逻辑。 然后,无论您在哪里创建凭证,都应改为创建 MyVoucher 实例,在这种情况下,可以从hmc或使用impex文件将 Voucher 的插入替换为 MyVoucher 。 在凭证示例中,此解决方案可能有效并且最简单,但并非总是可以根据需要控制对象的创建,在这种情况下,您可以选择第二种方法:

  • 第二种可能性是使用面向方面的编程,如果您不熟悉它,这将不简单。 AOP允许您拦截任何类的任何方法的执行并应用自己的逻辑。

例如,如果您要推断hybris默认 PromotionOrderChangeDeliveryModeAction evaluate()方法,则需要创建文件 aop.xml 位于 myextension/resources/META-INF 中(如果不存在,请创建它),它应该像这样:

  
      
          
      
      <方面>
          
      
  

  

weaver内的 include 标记表示将被扫描以查找要拦截的方法的包或类,在这种情况下,默认的hybris是 PromotionOrderChangeDeliveryModeAction 。 在第二部分中,声明了实际的方面,它是类似于以下内容的java类:

 包com.myproject.core.aspects;
 
  导入org.apache.log4j.Logger;
  导入org.aspectj.lang.ProceedingJoinPoint;
  导入org.aspectj.lang.annotation.Around;
  导入org.aspectj.lang.annotation.Aspect;
  导入org.aspectj.lang.annotation.Pointcut;
 
  @方面
  公共类ChangeDeliveryPromotionAspect {
      私有静态最终Logger LOG = Logger.getLogger(ChangeDeliveryPromotionAspect.class);
      @Pointcut(" execution(public * de.hybris.platform.promotions.jalo.PromotionOrderChangeDeliveryModeAction.apply(..))")
      公共无效评估(){
      }
      @Around(" evaluate()")
      公共对象评估(最终ProceedingJoinPoint pjp)抛出Throwable {
          LOG.info("正在评估OrderThresholdChangeDeliveryModePromotion"));
          返回pjp.proceed();
      }
  }
  

在此类中,我们指定要拦截的方法(@Pointcut批注),并拦截 @Around 。 之前或之后,还有其他可能性,以及采用方法参数或类实例本身的更为复杂的情况。
我希望这有助于指导如何覆盖jalo方法,因为关于该方法的信息不多
问候,胡安

Bunny_CDM
2楼-- · 2020-09-12 09:34

很好的建议,它可以工作,但是您还需要将Aspect包声明为include部分,否则它将引发异常(NoSuchMethodError:Aspect.aspectOf())。

  
    
      
    
    
    <方面>
      
    
  
 

  
callcenter油条
3楼-- · 2020-09-12 09:18

对此进行了更新,重写jalo类定义非常简单,您需要做的就是使用的标准类名来定义自己的bean。 您要覆盖的jalo类作为id。 例如,考虑前面的示例,可以按照附件中的说明实现。 希望这会有所帮助!

[1]:/storage/temp/4401-2015-11-26-14-12-21.png

SAP砖家
4楼-- · 2020-09-12 09:35

您好,Avdhey,无法打开附件,请分享

hongfeng1314
5楼-- · 2020-09-12 09:21

这是扩展和覆盖Jalo类而不创建新项的更好方法,请遵循以下步骤:1/扩展现有jalo类。 2/覆盖您想要的内容。 3/为您的新jalo声明一个bean,以下示例用于替代serailvoucher jalo:

*

木偶小白
6楼-- · 2020-09-12 09:34

我已经使用aop覆盖了" OrderPromotion" jalso类的" getOrderSubtotalAfterDiscounts()"方法,但是当我尝试获取" pjp.getTarget()"时,它给出了null 值。

aop.xml:

  
       
           
           
       
       <方面>
           
       
   
  
jovirus
7楼-- · 2020-09-12 09:20

Spring bean声明

  
                        

  

一周热门 更多>

点击此处---> EasySAP.com 一起学习S4 HANA ...

相关问答