Есть ли встроенная переменная среды Spring для корня веб-контекста?
Я использую Spring веб-службы для предоставления услуги в качестве веб-службы. В моем XML файле конфигурации Spring у меня есть bean, который является экземпляром DefaultWsdl11Definition. Одним из свойств, которые необходимо установить, является locationUri. Это должен быть полностью квалифицированный Uri, но я не хочу менять это значение, когда приложение получает повышение от dev до uat и к производству. Spring знает, что такое корневой контекст веб-приложения, и есть ли переменная, которую я могу указать в своем файле конфигурации для доступа к ней?
Что-то вроде:
<bean id="myWebServices"
class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
<property name="schemaCollection">
<bean
class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
<property name="xsds" ref="xsdList"/>
<property name="inline" value="true" />
</bean>
</property>
<property name="portTypeName" value="myWebServices" />
<property name="locationUri" value="${webContextRoot}/webServices" />
</bean>
Ответы
Ответ 1
С Spring 3.0 вы должны иметь доступ к контексту сервлета через servletContext bean в контексте веб-приложения:
<property name="locationUri" value="#{servletContext.contextPath}/webServices" />
Если вы используете pre- Spring -EL (до 3.0), вы должны иметь возможность делать
<bean name="servletContextBean" class="org.springframework.web.context.support.ServletContextFactoryBean" />
<bean name="contextPath" factory-bean="servletContextBean" factory-method="getContextPath" />
<bean name="locationUri" factory-bean="contextPath" factory-method="concat">
<constructor-arg value="/webServices" />
</bean>
и внутри вашего myWebservices bean
<property name="locationUri" ref="locationUri" />
EDIT:
Я не думаю, что получаю имя сервера и порт из ServletContext, так как в зависимости от настройки веб-контейнер может не знать имя хоста (например, HTTP-сервер может находиться перед веб-контейнером, например, tomcat может быть позади веб-сервер Apache или в зависимости от конфигурации Websphere).
Однако для получения имени хоста может быть частью решения. С помощью Spring 3.0 вы можете сделать следующее:
<property name="host"
class="java.net.InetAddress"
factory-method="getLocalHost"/>
<property name="locationUri"
value="http://#{host.canonicalHostName}:8080/#{servletContext.contextPath}/webServices" />
Ответ 2
У меня была аналогичная проблема, которую вы описали, я использую файлы свойств для этого
- ws_dev.properties
- ws_prod.properties
Я сконфигурировал свой файл свойств следующим образом: Свойство развертывания - это аргумент java vm, например
-Ddeployment=dev
<context:property-placeholder location="ws_${deployment}.properties"/>
Ответ 3
Может быть, поздно, но может и другое решение тоже нужно:
установить свойство в сервлет:
web.xml
<servlet>
<servlet-name>spring-ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring-ws-context.xml</param-value>
</init-param>
<init-param>
<param-name>transformWsdlLocations</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
Объявление bean в spring -ws-context.xml:
<bean id="WebService"
class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition"
p:portTypeName="App" p:locationUri="/WebServices" p:requestSuffix="Request"
p:responseSuffix="Response">
<property name="schema">
<bean class="org.springframework.xml.xsd.SimpleXsdSchema" p:xsd="classpath:/requestTypes.xsd" />
</property>
</bean>
Ответ 4
Вы можете добавить интерфейс ApplicationContextAware к вашему bean, отбросить его в WebApplicationContext, а затем получить ServletContext. Также см. Класс org.springframework.web.context.ContextLoader