2010-04-02 24 views
1

我想通过将它们作为Java类的静态最终字符串变量存储,并引用或静态导入它们,将它们用作XML,字符串,方法,注释等中的值来强制执行标准化的键。如何在XML文件中利用字符串常量?

有谁知道一个好的方法,让Maven插入(如过滤)像StringKeys.SOME_KEY值到一个XML文件?例如像

<element value="${StringKeys.SOME_KEY}"/> 

或类似的 - 主要想法是强制通用性和防止关键失准。或者一种替代解决方案来实现 - 用一些语义来说,如果一个不存在的字符串被引用,它在构建过程中会失败?如果它在C#中工作,也可以获得奖励积分。

+0

你想比过滤别的东西,对不对? – 2010-04-02 21:07:19

+0

是的 - 因为我希望令牌的来源位于Java类中 - 理想情况下更接近EL评估的东西,但这会代替 – jayshao 2010-04-02 21:16:10

回答

1

您可以使用XSLT生成您的POM,大概是指你可以用下面的

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dyn="http://exslt.org/dynamic" extension-element-prefixes="dyn" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:masterrule="com.Xxxxxx.ClassName" exclude-result-prefixes="masterrule #default"> 

<xsl:value-of select="masterrule:xxxxx"/> 
+0

这看起来很有前途(虽然不知道我是否将它用于POM,更可能是我们试图生成的XML配置文件,根据上面的问题) - 有更多示例的URL? – jayshao 2010-04-09 01:13:34

2

您可以使用XSLT并使用EL表达式扩展字符串。

+0

确实,您是否知道一种简单的方法将其绑定到构建或其他过程中? (和*最好是* C#) – jayshao 2010-04-02 21:20:34

+0

困难的部分是获取对象。Java回调机制是变压器特定的(例如java命名空间)。 – 2010-04-03 07:18:56

+0

是的,总体来说,我使用了相当多的XSLT,我认为它是 – jayshao 2010-04-06 15:19:59

1

有时使用字符串常量比它的价值更麻烦。国际海事组织就是这样一个例子。

但是,如果你想追求这一点,这里有一些想法,可能会为你工作:

  1. 使用Java DOM库建立在内存中的XML,使用Java常量。

  2. 将常量放入一个Properties对象中,然后使用Velocity,Freemarker或等效的Java兼容模板语言创建一个XML文件模板,该模板语言将属性值扩展到XML中。

    2a。在某些情况下,可以使用JSP代替通用的Java兼容模板语言。

  3. 使用指定常量的占位符生成XML,然后使用XSLT将占位符替换为实际值。

但在每一种情况下,你才能使用命名常量采取的步骤导致的脆弱性在其他领域,何况更多的代码和额外的处理。这使我回到了我原来的观点......

编辑我认为没有真正的好解决方案的真正原因是它是一个非常难的问题。

为了演示,使用JSP生成XML(和规范)将确保您只使用有效的Java常量,并且对于生成的Java类而言具有快速故障转移功能。但是,JSP方法并不能保证您生成格式良好的XML。

问题的根源在于,您需要在XML模板中嵌入Java构造的表现力,并结合静态检查模板的Java和XML方面的良构。您确实需要适当的语言支持,但实际上可用的解决方案只是输出字符而不考虑(在本例中)XML语法规则。

+0

虽然我倾向于同意你的看法,但如果从头开始这样做的话,我希望有人已经有了一个可靠的,快速的模板替换,它可以与Maven连接起来 - 因为它已经被烧毁了我们几次已经 – jayshao 2010-04-05 15:15:57

0

速度或类似是你最好的选择,但它需要编写你自己的插件。

我通常会在另一个方向上做这些 - 将键和值存储在属性文件中,并将其过滤到XML中,并将它们读入Java/C#类中。你可以在我们的书中的免费样章中找到一个例子:http://brettporter.wordpress.com/2009/09/30/apache-maven-2-effective-implementation-sample-chapter/

+0

所以一个属性文件让你干 - 你怎么防止从属性文件中拉空白字段? – jayshao 2010-04-09 01:14:09

+0

我不完全确定你的意思是在这里。你想能够设置默认值可以替换吗? – 2010-04-12 06:46:29

1

你不能使用XML枚举限制字符串吗?

<xsd:restriction base = "xsd:string"> 
    <xsd:enumeration value = "AUD"/><!-- Australian Dollar --> 
    <xsd:enumeration value = "BRL"/><!-- Brazilian Real --> 
    <xsd:enumeration value = "CAD"/><!-- Canadian Dollar --> 
</xsd:restriction> 
+0

虽然这并不真正让我获得与静态常量字符串相同的用法 - 例如我想要的是使用编译器为我测试这个并且不会破坏密钥 – jayshao 2010-04-09 01:12:31

+0

您可以使用xsd.exe [或java中的JAXB]生成一个C#[java]枚举。 – Fakrudeen 2010-04-12 06:49:14

相关问题