【问题标题】:How can I mix and match custom Spring schema types with traditional Spring schema types?如何混合和匹配自定义 Spring 模式类型与传统 Spring 模式类型?
【发布时间】:2009-09-25 17:31:48
【问题描述】:

假设我有一个类Person,其属性为nameage,它可以像这样使用Spring 进行配置:

<beans:bean id="person" class="com.mycompany.Person">
  <beans:property name="name" value="Mike"/>
  <beans:property name="age" value="38"/>
</beans:bean>

我想要一个自定义的 Spring 模式元素,这很容易做到,让我可以在我的 Spring 配置文件中拥有它:

<Person name="Mike" age="38"/>

架构定义如下所示:

<xsd:complexType name="Person">
  <xsd:complexContent>
    <xsd:extension base="beans:identifiedType">
      <xsd:attribute name="name" type="xsd:string"/>
      <xsd:attribute name="age" type="xsd:int"/>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>

基于此,现在假设我想要将自定义模式元素与 Spring bean 的传统元素和属性混合和匹配的选项,因此我可以选择这样做:

<Person name="Mike">
  <beans:property name="age" value="38"/>
</Person>

我该怎么做呢?如果没有一些重大的定制,这可能是不可能的,但我希望有一些相当简单的机制来实现这一点。我认为扩展“bean”可能是诀窍,但这看起来不正确。

【问题讨论】:

    标签: spring xsd


    【解决方案1】:

    首先,如果您的示例真的只是您想要做的,请考虑改用p-namespace 并避免让您头疼:

    <beans:bean id="person" class="com.mycompany.Person" p:name="Mike" p:age="38"/>
    

    是的,它看起来不像 &lt;Person name= age= /&gt; 漂亮,但没有自定义代码可写 :-)

    如果这不能满足您的要求,您正在考虑实现自己的名称空间/bean 定义解析器。 Spring 文档有一个chapter dedicated to that,它将更好地解释它。如果您遇到任何问题,请回复具体问题,我会尽力提供帮助。

    【讨论】:

    • 谢谢。我已经编写了自己的自定义 bean 定义解析器,它实际上非常简单。现在我正在尝试对其进行设置,以便我的自定义 bean 定义可以选择包含嵌套的“正常”bean 定义元素,就像我上面的示例一样。这个想法是我可以选择为 bean 的最常见属性创建自定义,但将不太常见的属性留给传统的 spring 元素。
    • 这种方法的一个问题是您无法轻松编写 XSD。扩展beans:identifiedType 不定义嵌套元素;它们在beanElements 组中定义,外部不可引用;所以你必须手动列出property 以及你想要在 XSD 中的任何其他内容。除此之外,嵌套元素应该自动为您处理;看看 Spring 的 util 命名空间及其处理程序/解析器;特别是地图。
    • @SingleShot 您的自定义 bean 定义解析器是否有任何更新/进展?
    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2018-08-19
    • 2020-08-09
    • 2020-11-15
    • 1970-01-01
    相关资源
    最近更新 更多