Существует ли встроенная переменная среды Spring для корня веб-контекста? - PullRequest
12 голосов
/ 03 августа 2011

Я использую Spring Web Services для предоставления сервиса в качестве веб-сервиса. В моем весеннем конфигурационном XML-файле у меня есть 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>

Ответы [ 4 ]

9 голосов
/ 04 августа 2011

В Spring 3.0 вы должны иметь доступ к контексту сервлета через bean-компонент servletContext в контексте веб-приложения:

<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

<property name="locationUri" ref="locationUri" />

РЕДАКТИРОВАТЬ:

Я не думаю, что получить имя сервера и порт из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" />
3 голосов
/ 03 августа 2011

У меня была похожая проблема, которую вы описали, для этого я использую файлы свойств

  • ws_dev.properties
  • ws_prod.properties

Я настроил свой файл свойств следующим образом, Свойство развертывания - это аргумент java vm, например

-Ddeployment=dev

<context:property-placeholder location="ws_${deployment}.properties"/>
2 голосов
/ 25 сентября 2013

Может быть поздно, но может понадобиться и другое решение:

установить свойство в сервлете:

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>

Объявление компонента весной-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>
0 голосов
/ 03 августа 2011

Вы можете добавить интерфейс ApplicationContextAware к вашему компоненту, привести его к WebApplicationContext и затем получить ServletContext. Также см. Класс org.springframework.web.context.ContextLoader

...