访问Grails插件中的资源

时间:2013-02-04 18:02:42

标签: grails plugins resources path

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

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

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

在我的'common'插件中有一个实现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: How to reference a resource located inside an installed plugin?但这无助于我。

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

1 个答案:

答案 0 :(得分:1)

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

xmlNamespaces.load(this.getClass().getClassLoader().getResourceAsStream(XML_NAMESPACES_FILE));