Как загрузить файл xsd, который хранится в папке my / WEB-INF - PullRequest
4 голосов
/ 26 ноября 2011

Я хочу загрузить файл xsd, который хранится в:

/WEB-INF/myxsd.xsd

Я буду ссылаться на это в действии моего контроллера, не уверен, как это сделать.

Кроме того, так какЯ буду ссылаться на это все время, могу ли я загрузить его один раз вместо запроса?

public String create() {

   // load xsd file here 

}

Используете ли вы относительный или полный путь?

Обновление

У меня уже есть этот код, которому нужен xsd-файл, в котором я проверю схему.

    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = schemaFactory.newSchema(schemaFile);

schemaFile - это то, что мне нужно для инициализации, похоже, newSchemaимеет несколько перегрузок (файл, URI и т. д.), , но это локальный файл, поэтому имеет смысл получить правильный файл ?Validator validator = schema.newValidator ();

Мне нужна помощь при загрузке этого xsd-файла из моей папки / Web-inf /.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2011

ServletContext имеет метод getRealPath (). Поэтому servletContext.getRealPath ("WEB-INF") даст вам абсолютный путь к каталогу WEB-INF.

Использовать ServletContext # getResourceAsStream ().

Чтобы загрузить его только один раз за запрос, вы можете создать поле и загружать его лениво.

Но еще лучше было бы загрузить его как атрибут контекста с прослушивателем жизненного цикла.

1 голос
/ 26 ноября 2011

ИМХО, способ Spring сделать это - ввести SchemaFactory и Resource в контроллер и инициализировать схему только один раз.NB Согласно Javadocs Schema является поточно-ориентированным.

public class MyController ... implements InitializingBean {
    private SchemaFactory schemaFactory;
    private Schema schema;
    private Resource schemaResource;

    public void setSchemaFactory(SchemaFactory schemaFactory) {
        this.schemaFactory = schemaFactory;
    }

    public void setSchemaResource(Resource schemaResource) {
        this.schemaResource = schemaResource;
    }

    public void afterPropertiesSet() throws Exception {
        Source xsdSource = new StreamSource(schemaResource.getInputStream());
        schema = schemaFactory.newSchema(xsdSource);
    }

    public void create() {
        // use schema
    }
}

И конфигурация пружины:

<bean id="schemaFactory" 
      class="javax.xml.validation.SchemaFactory"
      factory-method="newInstance">
    <constructor-arg>
        <util:constant static-field="javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI"/>
    </constructor-arg>
</bean>

<bean id="myController" class="...MyController">
    <property name="schemaFactory" ref="schemaFactory" />
    <property name="resource" value="/WEB-INF/myxsd.xsd" />
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...