我有一个名为“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:如何引用位于已安装插件中的资源?但这对我没有帮助。
知道如何解决这个问题吗?