Как получить путь контекста приложения в Spring-WS?

Я использую Spring-WS для создания веб-сервиса. В моем проекте я создал класс Helper для чтения образца ответа и запроса XML-файла, который находится в моей папке /src/main/resource.

Когда я тестирую свое приложение веб-сервиса «локально», я использую System.getProperty("user.dir") для получения папки контекста приложения. Ниже приводится метод, который я создал в классе Helper, чтобы помочь мне получить интересующий меня файл в моей папке ресурсов.

 public static File getFileFromResources(String filename) {
  System.out.println("Getting file from resource folder");
  File request = null;
  String curDir = System.getProperty("user.dir");
  String contextpath = "C:\\src\\main\\resources\\";
  request = new File(curDir + contextpath + filename);
  return request;
 }

Однако после «публикации» скомпилированного файла WAR в папке ../webapps в каталоге Apache Tomcat я понимаю, что System.getProperty("user.dir") больше не возвращает путь контекста моего приложения. Вместо этого он возвращает корневой каталог Apache Tomcat, как показано

C: \ Program Files \ Apache Software Foundation \ Tomcat 6.0 \ src \ main \ resources \ SampleClientFile

Кажется, я не могу найти никакой информации о получении корневой папки моего веб-сервиса. Я видел примеры в веб-приложении Spring, где я могу получить контекстный путь, используя следующее:

request.getSession().getServletContext().getContextPath()

Но в этом случае я использую веб-приложение Spring, в котором в запросе есть контекст сервлета. Но Spring-WS, моя точка входа - это конечная точка. Как я могу получить контекстный путь моего приложения веб-сервиса.

Я ожидаю контекстный путь чего-то вроде

C: \ Program Files \ Apache Software Foundation \ Tomcat 6.0 \ webapps \ clientWebService \ WEB-INF \ classes

Может ли кто-нибудь предложить способ достижения этого?


person Dhaliwal    schedule 11.01.2011    source источник


Ответы (2)


Вы можете получить текущий запрос от RequestContextHolder:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

Немного неуклюжий, но, вероятно, ваш лучший вариант здесь.

person skaffman    schedule 11.01.2011

Я не думаю, что есть какие-либо гарантии, что ваше приложение действительно будет в папке или что вашему коду будет разрешено исследовать произвольные части файловой системы. Некоторые серверы приложений могут не взорвать файл war, и местоположение вашего приложения фактически будет внутри самого файла архива.

Однако вы можете загрузить любой ресурс в самом приложении, независимо от того, где он находится. ServletContext позволяет сделать это, например, с помощью javax.servlet.ServletContext # getResourceAsStream. Вы также можете узнать здесь контекстный путь приложения (как в пути запроса).

Вы можете получить доступ к контексту сервлета, реализовав org.springframework.web.context.ServletContextAware в своем компоненте.

person Pawel Zieminski    schedule 17.06.2013