我有一个名为'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?但这无助于我。
知道如何解决这个问题吗?
答案 0 :(得分:1)
通过将.properties文件放在类路径而不是conf /目录中,然后使用类加载器来处理资源来解决这个问题。
xmlNamespaces.load(this.getClass().getClassLoader().getResourceAsStream(XML_NAMESPACES_FILE));