12

我正在使用 Spring Web Services 将服务公开为 Web 服务。在我的 spring 配置 xml 文件中,我有一个 bean,它是 DefaultWsdl11Definition 的一个实例。需要设置的属性之一是locationUri。这需要是完全合格的 Uri,但我不想在应用程序从 dev 升级到 uat 再到生产时更改此值。Spring 知道 Web 应用程序上下文根是什么,那么我可以在配置文件中指定一个变量来访问它吗?

就像是:

<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

4 回答 4

9

使用 Spring 3.0,您应该能够通过 Web 应用程序上下文中的 servletContext bean 访问 servlet 上下文:

<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" />

编辑:

我不认为从 ServletContext 获取服务器名称和端口,因为根据设置,Web 容器可能不知道主机名(即 HTTP 服务器可能位于 Web 容器前面,例如,tomcat 可能位于 Apache Web 后面服务器或取决于 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" />
于 2011-08-03T23:58:12.460 回答
3

我遇到了您描述的类似问题,我使用属性文件来执行此操作

  • ws_dev.properties
  • ws_prod.properties

我像这样配置了我的属性文件,部署属性是 java vm 参数,如

-Ddeployment=dev

<context:property-placeholder location="ws_${deployment}.properties"/>
于 2011-08-03T19:40:43.530 回答
2

可能会迟到,但可能其他一些人也需要解决方案:

在 servlet 中设置属性:

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>

spring-ws-context.xml中的bean声明:

<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>
于 2013-09-24T22:17:13.213 回答
-1

您可以将 ApplicationContextAware 接口添加到您的 bean,将其转换为 WebApplicationContext,然后获取 ServletContext。另见类 org.springframework.web.context.ContextLoader

于 2011-08-03T18:55:11.653 回答