1

我有一个名为“foo”的 Grails 插件,它使用另一个名为“ common ”的 Grails 插件。

grails.plugin.location.'common' = "../common"

' common ' 插件包含域类以及资源文件(.properties 文件、xml 模板等)。这些文件都位于common/grails-app/conf/的子文件夹中。

在我的“通用”插件中有一个实现 NamespaceContext 的类,它使用这些文件来正常运行。

public class MyNamespaceContext implements NamespaceContext {

private Map<String, String> namespaces;

public MyNamespaceContext() {

    final String XML_NAMESPACES_FILE = "grails-app/conf/xml/xmlNamespaces.properties";

    try {
        Properties xmlNamespaces = new Properties();
        xmlNamespaces.load(new FileReader(XML_NAMESPACES_FILE));
        namespaces = new HashMap<String, String>((Map) xmlNamespaces);
    } catch (FileNotFoundException e) {
        throw new RuntimeException("XML namespaces file '" + XML_NAMESPACES_FILE + "' cannot be found");
    } catch (IOException e) {
        throw new RuntimeException("IOException");
    }
}

...

}

这个类在几个类中使用,也位于形成我的域模型的“common”中,实现为 xml 装饰器。

  public class UserXmlDecorator implements User {

    private Document xmlDocument;
    private XPath xPath;
    private final String rawXml;

    public UserXmlDecorator(String rawXml) {
        this.rawXml = rawXml;
        this.xmlDocument = XmlDocumentFactory.INSTANCE.buildXmlDocumentInUTF8(rawXml);
        this.xPath = XPathFactory.newInstance().newXPath();
        xPath.setNamespaceContext(new MyNamespaceContext());
    }

    public String getUserName() {
        try {
            XPathExpression userNameXPathExpr = xPath.compile("...");
            String userName = userNameXPathExpr.evaluate(appendixBXmlDocument);
            return userName;
        } catch (XPathExpressionException e) {
            throw new RuntimeException();
        }
    }

    public String getAge() {
        try {
            XPathExpression ageXPathExpr = xPath.compile("...");
            String age = ageXPathExpr.evaluate(appendixBXmlDocument);
            return age;
        } catch (XPathExpressionException e) {
            throw new RuntimeException();
        }
    }

在我的 Grails 插件“foo”中创建这些装饰器时,我得到一个 FileNotFound 异常,因为它正在foo/grails-app/conf/xml/xmlNamespaces.properties中寻找模板,而不是common/grails-app/conf/ xml/xmlNamespaces.properties

我读过 Grails:如何引用位于已安装插件中的资源?但这对我没有帮助。

知道如何解决这个问题吗?

4

1 回答 1

1

通过将 .properties 文件放在类路径而不是 conf/ 目录中,然后使用类加载器加载资源来解决这个问题。

xmlNamespaces.load(this.getClass().getClassLoader().getResourceAsStream(XML_NAMESPACES_FILE));
于 2013-02-06T10:55:19.063 回答