1

「 common 」という別のGrailsプラグインを使用する「foo」というGrailsプラグインがあります。

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

' common 'プラグインには、ドメインクラスと、リソースファイル(.propertiesファイル、xmlテンプレートなど)が含まれています。これらのファイルはすべて、common / grails-app /conf/のサブフォルダーにあります。

正しく機能するためにこれらのファイルを使用する私の「共通」プラグインにNamespaceContextを実装するクラスが1つあります。

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");
    }
}

...

}

このクラスは、xmlデコレータとして実装された、私のドメインモデルを形成する「common」にあるいくつかのクラスで使用されます。

  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'でこれらのデコレータを作成すると、 common / grails-app /conf/ではなくfoo/grails-app / conf / xml / xmlNamespaces.propertiesでテンプレートを検索するため、FileNotFound例外が発生します。 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 に答える