Подтвердить что ты не робот

Есть ли встроенная переменная среды 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>
4b9b3361

Ответ 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