让默认生成的hybris数据bean扩展自己生成的数据bean

Let default generated hybris data bean extend own generated data bean

我正在尝试通过我自己的类型扩展默认的 hybris 数据 bean。我的代码目前看起来像

 <bean class="de.hybris.platform.commercefacades.product.data.MediaData">
     <property name="mediaType" type="de.hybris.platform.commercefacades.product.data.MediaDataType"/>
     </bean>

     <enum class="de.hybris.platform.commercefacades.product.data.MediaDataType">
         <value>IMAGE</value>
         <value>VIDEO</value>
     </enum>

     <bean class="de.hybris.platform.commercefacades.product.data.ImageData"
           extends="de.hybris.platform.commercefacades.product.data.MediaData"/>

这里的问题是生成的ImageData对象不会扩展MediaData。生成的代码如下所示:

 package de.hybris.platform.commercefacades.product.data;

 import de.hybris.platform.commercefacades.product.data.ImageDataType;

 public class ImageData  implements java.io.Serializable 
 {

     /** <i>Generated property</i> for <code>ImageData.altText</code> property defined at extension <code>commercefacades</code>. */
     private String altText;
     /** <i>Generated property</i> for <code>ImageData.format</code> property defined at extension <code>commercefacades</code>. */
     private String format;
     /** <i>Generated property</i> for <code>ImageData.width</code> property defined at extension <code>acceleratorfacades</code>. */
     private Integer width;
     /** <i>Generated property</i> for <code>ImageData.galleryIndex</code> property defined at extension <code>commercefacades</code>. */
     private Integer galleryIndex;
     /** <i>Generated property</i> for <code>ImageData.imageType</code> property defined at extension <code>commercefacades</code>. */
     private ImageDataType imageType;
     /** <i>Generated property</i> for <code>ImageData.url</code> property defined at extension <code>commercefacades</code>. */
     private String url;

     public ImageData()
     {
         // default constructor
     }

     // Getter and Setter    
     [...]

 }

这里是定义新数据对象的唯一方法还是可以覆盖默认的 hybris 数据 bean?

您在此处进行的配置不正确。我可以引用一个 hybris(v6.1) 片段,它展示了 bean 的继承。

请查看以下摘自 acceleratorfacades 的片段-beans.xml

<bean class="de.hybris.platform.acceleratorfacades.payment.data.PaymentSubscriptionResultData" 
   extends="de.hybris.platform.acceleratorservices.payment.data.PaymentSubscriptionResult">
    <property name="storedCard" type="de.hybris.platform.commercefacades.order.data.CCPaymentInfoData"/>
</bean>

这表明 bean PaymentSubscriptionResultData 扩展了 PaymentSubscriptionResult。

现在如果你去看看 de.hybris.platform.acceleratorfacades.payment.data.PaymentSubscriptionResultData,它实际上延伸 de.hybris.platform.acceleratorservices.payment.data.PaymentSubscriptionResult

现在以您的示例为例,您提到的 bean

de.hybris.platform.commercefacades.product.data.ImageData 已经作为 hybris 预定义 bean 存在。 您不能使用任何其他基本 bean (class) 扩展该 bean,因为首先生成基本扩展 bean。依赖关系是在自定义扩展中计算的,并且为(已经生成的)基础 bean 提供了扩展属性,而不是创建一个新的 bean。

如果您想要自定义任何预定义的 bean,那么您将必须创建自己的 bean(层次结构)并相应地引入属性。

能否请您告诉我您正在寻找的确切场景。

您可以跨不同的扩展定义单个 bean 或枚举。当您构建平台时,只会生成一个 Java class,其中包含所有属性的合并列表。根据扩展依赖项合并 Bean。

这意味着 java class 是用第一个扩展生成的,然后第二个(取决于第一个扩展)将它的属性添加到现有的 class 和而已。您不能再将 "extends" 添加到 class。

总而言之,如果您想让来自 commercefacade 的 ImageData 扩展您的自定义 MediaData,您需要添加到 extensioninfo.xml of commercefacade <requires-extension name="your_custom_extension"/>。这样您的扩展程序将首先加载。

your_custom_extension中定义在beans.xml

<bean class="de.hybris.platform.commercefacades.product.data.MediaData">
 <property name="mediaType" type="de.hybris.platform.commercefacades.product.data.MediaDataType"/>
 </bean>

 <enum class="de.hybris.platform.commercefacades.product.data.MediaDataType">
     <value>IMAGE</value>
     <value>VIDEO</value>
 </enum>
<bean class="de.hybris.platform.commercefacades.product.data.ImageData"
       extends="de.hybris.platform.commercefacades.product.data.MediaData"/>

运行 ant clean all,刷新你的平台,你会看到生成的 ImageData class 将扩展 MediaData。

当然不鼓励修改 hybris 扩展的依赖关系。你不应该修改它们。相反,只需将您需要的属性添加到现有 bean 中即可。在您的自定义扩展中,在 beans.xml 中定义它:

<bean class="de.hybris.platform.commercefacades.product.data.ImageData">
 <property name="mediaType" type="de.hybris.platform.commercefacades.product.data.MediaDataType"/>
</bean>
<enum class="de.hybris.platform.commercefacades.product.data.MediaDataType">
     <value>IMAGE</value>
     <value>VIDEO</value>
</enum>

如果您真的需要一个 ImageData class 来扩展您的 MediaData,最好的解决方案是不使用 Hybris bean 生成器并定义一个 class 用于您自己的逻辑.